反射理解

/*
public class ReflectDome {
public static void main(String[] args) {
	try { 
		/*
		 * 反射基础 Class类(反射的入口:java.lang.Class)
		 * 调用静态方法 Class.forName("全类名") 初始化(加载这个类)
		 * */
		Class<?> classzz=Class.forName("entity.User");
		/*
		 * new与newInstance区别
		 * 作用都是实例化
		 * newInstance 是将 new 分为两步
		 * 1. 调用 Class.fromName() 加载类
		 * 2. 进行实例化
		 * 当使用 newInstance时 这个类必须被加载了 也就是说 在jvm内存空间中必须有 了对象存在
		 * 而使用 new 这个类可以没有加载   只有当调用时 对象 才在内存空间中开辟出来
		 * 一
		 * new 是强类型
		 * newInstance 是弱类型  Object
		 * 二
		 * new 可以调用类的任意构造
		 * newInstance 只能调用无参构造 调用有参构造 会抛异常
		 * 
		 * newInstance 好处 工厂模式  单例模式 常用
		 * 对代码解耦
		 * Class.forName("xx")  这里可以从配置文件中获取
		 * */
		Object obj=classzz.newInstance();
		 * 获取属性
		 * java.lang.class类下方法
		 * getFields() 只能获得公共属性   包括父类
		 * getgetDeclaredFields 获取本类所有方法
		 * */
		Field [] fp=classzz.getFields();
		//获取 h 属性
		Field ff=classzz.getField("i");
		//设置属性 
		ff.set(obj, 2);
		//set get user.i 并没有这两个方法 但是  set  和  get 继承Object  
		System.out.println(ff.get(obj));
		for(Field f:fp) {
			System.out.println(f);
		}
		System.out.println("______________________________________");
		Field [] fprivate =classzz.getDeclaredFields();
		Field fprs= classzz.getDeclaredField("pwd");
		fprs.setAccessible(true);
	    fprs.set(obj, "vvvv");
		Field fpr= classzz.getDeclaredField("name");
		fpr.setAccessible(true);//对私有字段的访问取消检查
		fpr.set(obj, "老王");
		System.out.println(fpr.get(obj)+""+fprs.get(obj));
		 
		for(Field f:fprivate) {
			System.out.println(f);
		}
		
		
		System.out.println("______________________________________");
	 /*
	  *调用方法
	  *getDeclaredMethods() 获得本类所有的方法
	  *getMethods() 获取包括父类所有的公共方法
	  *获得指定方法(对象)                setName方法名       String.class参数类型
	  *Method m=classzz.getDeclaredMethod("setName", String.class);
	  *invoke()  回调方法
	  *通过获得指定的方法 对象  m 来回调方法
	  *m.invoke(obj,value)    obj回掉方法所属的类   value 赋值
	  * */
		Method [] mm=classzz.getMethods();
	 Method [] men=classzz.getDeclaredMethods();
	 Method m=classzz.getDeclaredMethod("setName", String.class);
	 m.invoke(obj, "123");
	 Method ms=classzz.getDeclaredMethod("setert", String.class);
	 ms.setAccessible(true);
	 ms.invoke(obj, "WWWW");
	 System.out.println(obj);
			 //m.invoke(obj, args)
	 for(Method me:men) {
		 System.out.println(me);
	 }
	 
	} catch (Exception e) {
		e.printStackTrace();
	}
}

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值