java反射三种实现方式

java反射的三种实现方式

什么是java反射

​ Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。反射被视为动态语言的关键。

java反射的三种实现方式

​ 为了方便演示,先创建一个person类

//创建一个Person类
public class Person {

    private String name; //私有属性姓名
    private int age;     //私有属性年龄
    public int height;   //公有属性身高
    public String sex;   //公有属性性别

     public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
    
    //公有方法
    public void say(){
        System.out.println("say hello");
    }
    
    //私有方法
    private void eat(){
        System.out.println("eat food");
    }
}

第一种方式:

通过已经知道该类的对象调用getClass方法

Person person = new Person();
//第一种方法 通过Object类的getClass方法
Class pClass = person.getClass();

第二种方式:

通过这个类的.class获得该类的Class对象

//第二种方式 任何一个类都是Class的实例对象,通过这个类的.class获得该类的Class对象
Class pClass = Person.class;

第三种方式:

Class.forName()方式:通过指定类的全路径名来获取该类的Class对象

//第三种方式 Class.forName()方式:通过指定类的全路径名来获取该类的Class对象
Class pClass = Class.forName("com.pojo.Person");

用第三种方法需要抛出一个ClassNotFoundException的异常

常用方法

System.out.println(pClass.getName()); //com.pojo.Person
System.out.println(pClass.getSuperclass()); //class java.lang.Object
System.out.println(Arrays.toString(pClass.getMethods())); //获取Person类和父类的所有方法
System.out.println("===================");
System.out.println(Arrays.toString(pClass.getDeclaredMethods()));//获取Person类的所有方法
System.out.println("===================");
System.out.println(Arrays.toString(pClass.getFields()));//获取Person的所有公有属性
System.out.println("===================");
System.out.println(Arrays.toString(pClass.getDeclaredFields()));//获取Person的所有属性,包括私有属性
System.out.println("===================");
System.out.println(pClass.getField("height"));//获取对应名的公有属性信息 需抛出NoSuchFieldException异常
System.out.println("===================");
System.out.println(pClass.getDeclaredField("name"));//获取对应名的公有或私有属性信息 需抛出NoSuchFieldException异常
System.out.println("====================");
//获取对应方法的信息,需要传入方法名和方法参数的类型,空参则传null。需抛出NoSuchMethodException异常
System.out.println(pClass.getMethod("say", null));
输出结果
com.pojo.Person
class java.lang.Object
[public void com.pojo.Person.say(), public final void java.lang.Object.wait() throws java.lang.InterruptedException, public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException, public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException, public boolean java.lang.Object.equals(java.lang.Object), public java.lang.String java.lang.Object.toString(), public native int java.lang.Object.hashCode(), public final native java.lang.Class java.lang.Object.getClass(), public final native void java.lang.Object.notify(), public final native void java.lang.Object.notifyAll()]
===================
[public void com.pojo.Person.say(), private void com.pojo.Person.eat()]
===================
[public int com.pojo.Person.height, public java.lang.String com.pojo.Person.sex]
===================
[private java.lang.String com.pojo.Person.name, private int com.pojo.Person.age, public int com.pojo.Person.height, public java.lang.String com.pojo.Person.sex]
===================
public int com.pojo.Person.height
===================
private java.lang.String com.pojo.Person.name
====================
public void com.pojo.Person.say()

利用反射机制实例化对象

1.对于有空构造函数的类 可以直接用字节码文件获取实例:

Class pClass = Class.forName("com.pojo.Person");
//在获取类信息后,可以使用反射机制实例化一个对象
//调用 Class 对象的 newInstance() 方法,该方法会调用默认构造函数来实例化对象,如果类没有默认构造函数或者默认构造函数不可访问,则会抛出 InstantiationException 异常
Person p = (Person) pClass.newInstance();//这里我们知道是Person类,所有直接强转了
//调用say方法
p.say();

2.对应写了带参构造方法的类,没有空的构造函数则需要先获取到他的构造对象 在通过该构造方法类获取实例:

//Person类添加了如下的带参构造方法
public Person(String name, int age, int height, String sex) {
        this.name = name;
        this.age = age;
        this.height = height;
        this.sex = sex;
    }
Class pClass = Class.forName("com.pojo.Person");
 //调用构造函数进行实例化,通过获取类的构造函数对象(Constructor),然后通过该对象的 newInstance() 方法来实例化对象,可以传入相应的构造函数参数。
Constructor constructor = pClass.getConstructor(String.class, int.class, int.class, String.class);
Person o = (Person) constructor.newInstance("小明", 12, 178, "男");
o.say();
System.out.println(o.getName());
System.out.println(o.sex);
  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值