反射的作用:
.反射类的作用
- 动态获取:动态获取类或对象的属性和方法
- 动态调用:动态调用对象的属性和方法
3.反射的使用场景
- 操作因访问权限限制的属性和方法; 例如 依赖问题 引用不到不能直接获取 获取私有属性引用不到
- 实现自定义注解;
- 动态加载第三方jar包
- 按需加载类,节省编译和初始化时间;
class类的介绍 就是一个描述类的结果普通类
已知具体的类,通过类的 class 属性获取
Class clazz = Person.class;
1
已知某个类的实例,调用该实例的 getclass() 方法获取 Class 对象
Person p1 = new Person();
Class clazz = p1.getclass();
1
2
已知一个类的全类名,且该类在类路径下,可通过 Class 类的静态方法 forName() 获取,可能抛出 ClassNotFoundException(比较常用)
Class clazz = Class.forName(“com.test.Person”);
1
通过类加载器
ClassLoader cl = Person.getclass().getClassLoader();
Class clazz = cl.loadClass(“com.test.Person”);
————————————————
版权声明:本文为CSDN博主「Empty-cup」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_17310871/article/details/124614868
public class User {
private String name;
private int age;
public User() {
}
public User(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public static void main(String[] agrs) {
try {
Class clazz = Class.forName("test.User");
//无参构造方法
Constructor con = clazz.getDeclaredConstructor();
Object obj = con.newInstance();
Method getNameMethod = clazz.getDeclaredMethod("getName");
Method setNameMethod = clazz.getDeclaredMethod("setName", String.class);
//
System.out.println(getNameMethod.invoke(obj));
setNameMethod.invoke(obj, "小米");
System.out.println(getNameMethod.invoke(obj));
System.out.println("===========================");
System.out.println(getNameMethod.invoke(obj, null));
System.out.println("===========================");
//有参构造方法
Constructor con1 = clazz.getDeclaredConstructor(String.class, int.class);
Object obj1 = con1.newInstance("小牧", 30);
System.out.println(getNameMethod.invoke(obj1));
//字段 有set和get 方法 注意setAccessible
Field nameField = clazz.getDeclaredField("name");
nameField.setAccessible(true);
System.out.println(nameField.get(obj1));
nameField.set(obj1, "4445");
System.out.println(nameField.get(obj1));
nameField.setAccessible(false);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
结果:
null
小米
===========================
小米
===========================
小牧
小牧
4445
Original: https://blog.csdn.net/shuangrenlong/article/details/128425595
Author: shuangrenlong
Title: 反射实例展示
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/788346/
转载文章受原作者版权保护。转载请注明原作者出处!