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

原创文章,作者:6024010,如若转载,请注明出处:https://blog.ytso.com/272233.html

(0)
上一篇 2022年7月9日
下一篇 2022年7月9日

相关推荐

发表回复

登录后才能评论