java —— 反射

 反射   

    java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性,这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。即:通过class文件对象,去使用该文件中的成员变量、构造方法、成员方法      要想解剖一个类,必须先要获取到该类的字节码文件对象。 而解剖使用的就是Class类中的方法。所以先要获取到每一个字节码文件对应的Class对应的Class类型的对象。

(内容如有错误,请评论留言,我马上修改) 

 

这是. java文件,.classClass对象大致的图 


 


 只列出了成员变量的,因为其他的和这个类似,都是有四种,就不写了

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);
	}
	
	
}

  

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值