反射理解

xiaoxiao2025-09-17  124

/* 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(); } }

}

转载请注明原文地址: https://www.6miu.com/read-5036475.html

最新回复(0)