反射
java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性,这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。即:通过class文件对象,去使用该文件中的成员变量、构造方法、成员方法 要想解剖一个类,必须先要获取到该类的字节码文件对象。 而解剖使用的就是Class类中的方法。所以先要获取到每一个字节码文件对应的Class对应的Class类型的对象。
(内容如有错误,请评论留言,我马上修改)
这是. java文件,.class和Class对象大致的图
只列出了成员变量的,因为其他的和这个类似,都是有四种,就不写了
Class cls=xxx.class;
Field[] fields1 =cls.getFields();//获取Class对象里面所有public的成员变量
Field[] fields2=cls.getDeclaredFields();获取Class对象中所有的成员变量
Field field1=cls.getField("a");//获取Class对象中名字为 a 的成员变量
Field field2=cls.getDeclaredField("b");//获取Class对象中名字为 b 的成员变量
接下来是我的一个demo,也只写了小部分。值得一提的是,要访问私有权限的成员的时候,比如执行反射得到的方法,得使用 setAccessible(true); 来忽视权限,不然报错
package test;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class testclass {
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
Class cls=A.class;
// 获取所有公有成员变量 getFields()
System.out.println("获取类A所有公有成员变量");
Field[] fields1=cls.getFields();
for (Field field : fields1) {
System.out.println(field);
}
// 获取所有成员变量 getDeclaredFields()
System.out.println("获取类A所有成员变量");
Field[] fields2=cls.getDeclaredFields();
for (Field field : fields2) {
System.out.println(field);
}
// 获取指定公有成员变量getField("xxx")
System.out.println("获取类A指定公有成员变量 a ");
Field field1=cls.getField("a");
System.out.println(field1);
// 获取指定私有成员变量getDeclaredField("xxx")
System.out.println("获取类A指定私有成员变量 b ");
Field field2=cls.getDeclaredField("b");
// Field field2=cls.getField("b");
System.out.println(field2);
// 获得指定名字,无参私有方法
System.out.println("获得指定名字,无参数的私有方法");
Method method1=cls.getDeclaredMethod("method1");
System.out.println(method1);
// 获得指定名字,参数的公有方法
System.out.println("获得指定名字,参数的公有方法");
Method method11=cls.getMethod("method3", String.class);
System.out.println(method11);
// 获得指定名字,参数的私有方法
System.out.println("获得指定名字,参数的私有方法");
Method method2=cls.getDeclaredMethod("method4", String.class);
System.out.println(method2);
// 获取所有成员方法
System.out.println("获取所有成员方法");
Method method[]=cls.getDeclaredMethods();
for (Method method0 : method) {
System.out.println(method0);
}
System.out.println("执行method1");
A aaa=new A();
method1.setAccessible(true);
method1.invoke(aaa);
}
}
package test;
public class A {
//成员变量
public int a;
private int b;
public String c;
//构造函数
A(){System.out.println("无参构造器执行");}
A(String aaa){System.out.println("有构造器执行"+aaa);}
A(int a1,int b1){a1=a;b1=b;System.out.println("公有 有参构造器执行");}
private A(int a1){a1=a;System.out.println("私有 有参构造器执行");}
//成员方法
private void method1() {System.out.println("执行私有方法");}
public void method2() {System.out.println("执行公有方法");}
public void method3(String s) {System.out.println("执行公有带参方法"+s);}
private void method4(String s) {System.out.println("执行私有带参方法"+s);}
public String toString() {
return ("a="+a+" , b="+b+", c="+c);
}
}