Java 反射 使用

反射就是Reflection,Java的反射是指程序在运行期可以拿到一个对象的所有信息。
反射是为了解决在运行期,对某个实例一无所知的情况下,如何调用其方法。

测试用User类

public class User {

    public final static String TEST = "static test";

    private Integer id;

    private String name;

    // 公有无参构造函数
    public User(){

    }

    // 私有有参构造函数
    private User(Integer id, String name){
        this.id = id;
        this.name = name;
    }

    // 公有方法
    public String sayHelloPublic(String name) {
        System.out.println("hello public " + name);
        return name;
    }

    // 私有方法
    private String sayHelloPrivate(String name) {
        System.out.println("hello private " + name);
        return name;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return this.id + " " + this.name;
    }
}

反射测试:

1. 反射创建对象,公有无参构造函数

@Test
public void reflectObject(){
    User user;
    try{
        user = (User) Class.forName("com.shpun.reflect.User").newInstance();
        user.setId(1);
        user.setName("张三");
        System.out.println(user);
    }catch (Exception e) {
        e.printStackTrace();
    }
}

2. 反射创建对象,私有有参构造函数

@Test
public void reflectObjectParam(){
    User user;
    try{
        Constructor<?> constructor =  Class.forName("com.shpun.reflect.User")
                .getDeclaredConstructor(Integer.class, String.class);
        // 设置该方法可访问
        constructor.setAccessible(true);
        user = (User) constructor.newInstance(1, "张三");
        System.out.println(user);
    }catch (Exception e) {
        e.printStackTrace();
    }
}    

3. 反射公有属性

@Test
public void reflectPublicField(){
    User user;
    try{
        Class<?> cls = Class.forName("com.shpun.reflect.User");
        Field field = cls.getField("TEST");
        user = (User) cls.newInstance();

        String test = (String) field.get(user);
        System.out.println(test);
    }catch (Exception e){
        e.printStackTrace();
    }
}

4. 反射私有属性

@Test
public void reflectPrivateField(){
    User user;
    try{
        Class<?> cls = Class.forName("com.shpun.reflect.User");
        Field field = cls.getDeclaredField("name");
        // 设置该属性可访问
        field.setAccessible(true);
        user = (User) cls.newInstance();
        user.setId(1);
        user.setName("张三");

        String name = (String) field.get(user);
        System.out.println(name);
    }catch (Exception e){
        e.printStackTrace();
    }
}

5. 反射公有方法

@Test
public void reflectPublicMethod(){
    User user;
    try{
        Class<?> cls = Class.forName("com.shpun.reflect.User");
        Method method = cls.getMethod("sayHelloPublic", String.class);
        user = (User) cls.newInstance();

        Object returnObj = method.invoke(user, "张三");
        System.out.println(returnObj);
    }catch (Exception e) {
        e.printStackTrace();
    }
}

6. 反射私有方法

@Test
public void reflectPrivateMethod(){
    User user;
    try{
        Class<?> cls = Class.forName("com.shpun.reflect.User");
        Method method = cls.getDeclaredMethod("sayHelloPrivate", String.class);
        // 设置该方法可访问
        method.setAccessible(true);
        user = (User) cls.newInstance();

        Object returnObj = method.invoke(user, "张三");
        System.out.println(returnObj);
    }catch (Exception e) {
        e.printStackTrace();
    }
}

参考:
Java高级特性——反射
反射
Java 程序员都需要懂的 反射!
Java反射

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值