java反射獲取私有屬性和方法demo
阿新 • • 發佈:2019-02-03
student物件
package MaReflection; public class Student { private int num; private String name; static { System.out.println("[執行靜態區塊]"); } public int getNum() { return num; } public void setNum(int num) { this.num = num; } public String getName() { return name; } public void setName(String name) { this.name = name; } public static void talk(String dd) { System.out.println("學生說話了"); System.out.println(dd); } @Override public String toString() { return "Student [num=" + num + ", name=" + name + "]"; } }
主類
package MaReflection; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class MaRelectionStudent { public static void main(String[] args) throws Exception{ updateStudent("MaReflection.Student", "name", "num", "talk"); } public static void updateStudent(String className,String namefield,String numfiled,String methodname) throws NoSuchMethodException, SecurityException, ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchFieldException, IllegalArgumentException, InvocationTargetException { Class clazz = Class.forName(className); Object o = clazz.newInstance(); System.out.println(o.toString()); Field field_name = clazz.getDeclaredField(namefield); field_name.setAccessible(true);//這個是修改物件屬性必須設定的,不然set屬性會報錯,因為這個物件屬性為private field_name.set(o, "張三"); Field field_num = clazz.getDeclaredField(numfiled); field_num.setAccessible(true); field_num.setInt(o, 1); Method method = clazz.getDeclaredMethod(methodname,String.class);//methodname是方法名 String.class這個是傳入引數方法型別 method.setAccessible(true); System.out.println("method.getName()++++"+method.getName()); System.out.println("method.getParameterTypes()+++"+method.getParameterTypes()); System.out.println(o.toString()); System.out.println("+++++++++++++++"); Object fObject=method.invoke(o,"我就是方法的引數"); System.out.println(fObject); } }
執行結果:
[執行靜態區塊]
Student [num=0, name=null]
method.getName()++++talk
method.getParameterTypes()+++[Ljava.lang.Class;@6d06d69c
Student [num=1, name=張三]
+++++++++++++++
學生說話了
我就是方法的引數
null
利用java反射可以對,物件的私有屬性和方法就行呼叫和動態修改。