Java 反射机制

1 什么是 Java 反射

就是正在运行,动态获取这个类的所有信息。

2 反射机制的作用

  • 反编译:.class --> .java
  • 通过反射机制访问 java 对象的属性,方法,构造方法等

3 反射机制的应用场景

Jdbc 加载驱动、Spring ioc、一些框架

4 反射创建对象的方式

@Data
public class User {

    private String username;

    private String address;

    public User(){
        System.err.println("使用反射技术,执行无参构造函数");
    }
    
    public User(String username){
        System.err.println("使用反射技术执行有参构造函数,用户名:"+username);
    }
}

反射方式创建User类:

  1. 执行无参构造函数
public class ClassFrom {

    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {

        //1.除了new创建对象,还可以使用反射机制创建对象
        //2.forName 必须传入 class 类的完整路径
        Class<?> forName = Class.forName("com.ljg.model.User");
        //3.newInstance 使用无参构造函数,创建对象
        Object newInstance = forName.newInstance();
        User user = (User) newInstance;

        System.err.println("user:"+user);
        user.setUsername("LeeJG");
        System.err.println(user.getUsername());

        //使用反射技术创建对象 和 使用 new 那个效率高? new效率高
    }
}
  1. 执行有参构造函数
public class ClassFrom {

    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
        
        //使用反射机制执行有参的构造函数,创建对象
        Class<?> forName = Class.forName("com.ljg.model.User");
        Constructor<?> constructor = forName.getConstructor(String.class);
        Object newInstance = constructor.newInstance("LeeJG");
        User user = (User) newInstance;
    }
}

5 反射机制获取类

反射api:

方法名称作用
getDeclaredMethods()获取该类的所有方法
getReturnType()获取该方法的返回值
getParameterTypes()获取传入参数
getDeclaredFields()获取该类的所有字段
setAccessible允许访问私有成员

获取 User 类的方法及方法返回类型:

public class ClassFrom {

    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {

        Class<?> forName = Class.forName("com.ljg.model.User");
        //获取该类的所有方法
        Method[] declaredMethods = forName.getDeclaredMethods();
        for (Method declaredMethod : declaredMethods) {
            System.err.println(declaredMethod.getName()+"------"+declaredMethod.getReturnType());
        }
    }
}

获取 User 类的所有成员属性:

public class ClassFrom {

    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {


        Class<?> forName = Class.forName("com.ljg.model.User");
        //拿到所有成员属性
        Field[] declaredFields = forName.getDeclaredFields();
        for (Field declaredField : declaredFields) {
            System.err.println(declaredField.getName()+"--------"+declaredField.getType());
        }
    }

使用反射机制访问User类的私有属性:

public class ClassFrom {

    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {

        //可以使用Java反射技术 访问到私有属性
        Field field = forName.getDeclaredField("username");
        //创建对象
        Object object = forName.newInstance();
        //允许访问私有成员属性
        field.setAccessible(true);
        field.set(object,"Mike");

        User user = (User) object;
        System.err.println(user.getUsername());
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值