java反射大白话
转自:http://www.java265.com/JavaCourse/202206/3796.html
下文通过笔者的这篇文章,将带你快速入门java反射,如下所示
java反射的概念
JAVA反射机制:
程序在运行时,可对任意一个实体类,
对任意一个对象
都可以调用其中的方法及属性
我们将这种运行时,获取其属性的功能称之为"java反射"
java反射的功效
1、运行时生成对象实例
2、运行期间调用方法
3、运行时更改属性Java反射的使用场景
1、在运行时判断任意一个对象所属的类
2、在运行时构造任意一个类的对象
3、在运行时判断任意一个类所具有的方法和属性
4、在运行时调用任意一个对象的方法
5、生成动态代理Java反射涉及类
类名用途Class类代表类的实体,在运行的Java应用程序中表示类和接口Field类代表类的成员变量(成员变量也称为类的属性)Method类代表类的方法Constructor类代表类的构造方法例:
User类
public class User {
private String name;
private int age;
private User(String name, int age) {
this.name = name;
this.age = age;
}
public User(){
throw new IllegalAccessError("禁止无参构造方法");
}
private String getName() {
return name == null ? "" : name;
}
private void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class TestClass{
public static void main(String[] args){
Class<?> clz = null;
try {
clz = Class.forName("User");//全路径名
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
// 找到带有这个参数的构造方法
Constructor constructor = null;
try {
constructor = clz.getDeclaredConstructor(String.class, int.class);
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
constructor.setAccessible(true);
// 初始化对象
Object user = null;
try {
user = constructor.newInstance("猫猫",20);
} catch (InstantiationException | IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
System.out.println("--------------"+constructor.toString());
// 找到该私有方法
Method getName = null;
try {
getName = clz.getDeclaredMethod("getName");
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
getName.setAccessible(true);
String name = null;
try {
name = (String) getName.invoke(user);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
System.out.println("--------------"+name);
// 找到私有属性
Field age = null;
try {
age = clz.getDeclaredField("age");
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
age.setAccessible(true);
try {
age.setInt(user16, 20); // 修改属性
} catch (IllegalAccessException e) {
e.printStackTrace();
}
try {
System.out.println("--------------"+age.get(user));
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页:
[1]