侧边栏壁纸
博主头像
小白博主等级

just do it!

  • 累计撰写 60 篇文章
  • 累计创建 77 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Java反射机制

小白
2019-08-28 / 0 评论 / 0 点赞 / 128 阅读 / 996 字

定义

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

与反射机制相关的类

Class类 代表类的实体,在运行的Java应用程序中表示类和接口

获取类相关方法:
方法 用途
asSubclass(Class clazz) 把传递的类的对象转换成代表其子类的对象
Cast 把对象转换成代表类或是接口的对象
getClassLoader() 获得类的加载器
getClasses() 返回一个数组,数组中包含该类中所有公共类和接口类的对象
getDeclaredClasses() 返回一个数组,数组中包含该类中所有类和接口类的对象
forName(String className) 根据类名返回类的对象
getName() 获得类的完整路径名字
newInstance() 创建类的实例
getPackage() 获得类的包
getSimpleName() 获得类的名字
getSuperclass() 获得当前类继承的父类的名字
getInterfaces() 获得当前类实现的类或是接口
获得类中属性相关方法
方法 用途
getField(String name) 获得某个公有的属性对象
getFields() 获得所有公有的属性对象
getDeclaredField(String name) 获得某个属性对象
getDeclaredFields() 获得所有属性对象

反射的三种方式

实例类:

package com.ant.cral.DTO;

public class User {
    private String name;
    private int age;
    public User(String name,int age){
        this.name=name;
        this.age=age;
    }
    private User(String name){
        this.name=name;
    }
    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }
}

getClass()方法

User user=new User();
Class classz=user.getClass();//获取user的Class对象

Object.class方法

Class classz = User.class;//获取User类的反射

Class.foraName(url)

try{
    //根据类的全路径名称获取
    Class classz=Class.forName("com.ant.cral.DTO.User");//获取类的反射对象
}catch (ClassNotFoundException e){
    e.printStackTrace();
}

以上三种方式获取一般推荐使用第三种通过Class.forName()方式获取

反射的使用

通过反射获取构造方法

try{
    //根据类的全路径名称获取
    Class classz=Class.forName("com.ant.cral.DTO.User");//获取类的反射对象

    //获取所有公有构造方法
    Constructor[] constructors=classz.getConstructors();
    for(Constructor constructor:constructors){
        System.out.println(constructor);
    }
    //获取所有构造方法
    Constructor[] constructor1=classz.getDeclaredConstructors();
    for(Constructor constructor:constructor1){
        System.out.println(constructor);
    }
    // 根据构造方法参数类型获取公有构造方法
    Constructor constructor2=classz.getConstructor(new Class[]{String.class,int.class});
    // 根据构造方法参数类型获取私有构造方法
    Constructor declaredConstructor=classz.getDeclaredConstructor(new Class[]{String.class});
}catch (ClassNotFoundException e){
    e.printStackTrace();
} catch (NoSuchMethodException e) {
    e.printStackTrace();
}

通过反射获取类属性

// 根据类的全路径名称获取
Class classz=Class.forName("com.ant.cral.DTO.User");// 获取类的反射对象
Field[] fields=classz.getFields();// 获取所有公有字段
Field[] fields1=classz.getDeclaredFields();// 获取所有字段(公共、私有)
Field field=classz.getDeclaredField("name");// 获取名称为name的指定私有字段
Object o=classz.getConstructor().newInstance();// 获取一个公有构造方法并且实例化
field.set(o,"antsit");// 给通过反射实例化的对象为其name属性赋值

通过反射获取类中的方法

//根据类的全路径名称获取
Class classz=Class.forName("com.ant.cral.DTO.User");//获取类的反射对象
Method[] methods=classz.getMethods();
Method[] methods1=classz.getDeclaredMethods();
Method method=classz.getMethod("setName",String.class);
Method method1=classz.getMethod("getName");
Object o=classz.getConstructor().newInstance();//获取一个公有构造方法并且实例化
Object invoke=method.invoke(o,"antsit");//给方法传值并执行(必须实例化对象后才可执行)

通过反射执行main方法

Class classz=Class.forName("com.ant.cral.DTO.User");//获取类的反射对象
Method method=classz.getMethod("main", String[].class);//获取main方法
method.invoke(null,(Object)new String[]{"a"});//调用执行
0

评论区