java反射-重点内容

一,反射机制作用:

  1. 可以操作字节码文件,使程序更加灵活

二,反射机制常用类:

  1. java.lang.Class:代表整个字节码,代表一个类型,代表整个类。
  2. java.lang.reflect.Method:代表字节码中的方法字节码。代表类中的方法。
  3. java.lang.reflect.Constructor:代表字节码中的构造方法字节码。代表类中的构造方法
  4. java.lang.reflect.Field:代表字节码中的属性字节码。代表类中的成员变量(静态变量+实例变量)

三,获取javaClass实例的方式:

  1. Class c = Class.forName("完整类名带包名")
  2. Class c = 对象.getClass()
  3. 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应用必不可少的技术
点击右上角即可分享
微信分享提示