java反射-重点内容
一,反射机制作用:
- 可以操作字节码文件,使程序更加灵活
二,反射机制常用类:
- java.lang.Class:代表整个字节码,代表一个类型,代表整个类。
- java.lang.reflect.Method:代表字节码中的方法字节码。代表类中的方法。
- java.lang.reflect.Constructor:代表字节码中的构造方法字节码。代表类中的构造方法
- java.lang.reflect.Field:代表字节码中的属性字节码。代表类中的成员变量(静态变量+实例变量)
三,获取javaClass实例的方式:
- Class c = Class.forName("完整类名带包名")
- Class c = 对象.getClass()
- Class c = 任何类型.class
四,反射机制的具体功能:
public class User{ public String name; private int password; public User() { } public User(String name, int password) { this.name = name; this.password = password; } public boolean login(String name, int password){ return "admin".equals(name) && password == 123456; } }
1.通过反射机制访问对象的某个属性
public class Reflect01 { public static void main(String[] args) throws Exception { //使用反射机制获取一个类的Class实例 Class<?> userClass = Class.forName("com.lv.reflect.User"); //通过这个类的Class创建类的实例化对象,底层调用了无参数构造方法,obj就是User对象 Object obj = userClass.newInstance(); //访问公有属性 //根据属性名来获取属性的Field实例 Field name = userClass.getDeclaredField("name"); //给obj对象的name属性赋值为张三 name.set(obj,"admin"); //获取obj的那么属性值并输出 System.out.println(name.get(obj)); //访问私有属性 Field age = userClass.getDeclaredField("password"); //需要增加一步打破封装,这样设置后,在外部也可以访问private的,可能给不法分子留下机会 age.setAccessible(true); age.set(obj,123456); System.out.println(age.get(obj)); } }
2.通过反射机制调用对象的某个方法
public class Reflect02 { public static void main(String[] args) throws Exception { //使用反射机制获取一个类的Class实例 Class<?> userClass = Class.forName("com.lv.reflect.User"); //通过这个类的Class创建类的实例化对象,底层调用了无参数构造方法,obj就是User对象 Object obj = userClass.newInstance(); //通过方法名获取这个方法的Method实例 Method login = userClass.getMethod("login", String.class, int.class); //执行obj对象的login方法,并传入参数,获取返回结果 Object result = login.invoke(obj, "admin", 123456); System.out.println((boolean)result?"登录成功":"登录失败"); } }
3.通过反射机制调用某个构造方法实例化对象
public class Reflect03 { public static void main(String[] args) throws Exception{ //使用反射机制获取一个类的Class实例 Class<?> userClass = Class.forName("com.lv.reflect.User"); //通过这个类的Class创建类的实例化对象,底层调用了无参数构造方法,obj就是User对象 Object obj = userClass.newInstance(); //获取有参数的构造方法 Constructor<?> con = userClass.getDeclaredConstructor(String.class, int.class); //用构造方法创建实例对象 Object o1 = con.newInstance("admin", 123456); System.out.println(o1); //获取无参数的构造方法 Constructor<?> con2 = userClass.getConstructor(); Object o2 = con2.newInstance(); System.out.println(o2); } }
4.通过反射机制获取父类以及父类型接口
public class Reflect04 { public static void main(String[] args) throws Exception{ // 获取String类的Class实例 Class<?> stringClass = Class.forName("java.lang.String"); // 通过Class实例获取String的父类 Class<?> superClass = stringClass.getSuperclass(); System.out.println(superClass.getName()); // 通过Class实例获取String类实现的所有接口(一个类实现的接口可以有多个) Class<?>[] interfaces = stringClass.getInterfaces(); for(Class<?> in : interfaces){ System.out.println(in.getName()); } } }
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术