利用Java反射获取对象 - 极悦
首页 课程 师资 教程 报名

利用Java反射获取对象

  • 2020-10-26 17:44:09
  • 1159次 极悦

与传统的通过new 来获取对象的方式不同,利用Java反射获取对象会先拿到Hero的“类对象”,然后通过类对象获取“构造器对象”再通过构造器对象创建一个对象。这种获取对象的方式相对来说更加安全,能够利用Java反射的特性来获取对象。


利用Java反射机制获取对象的具体步骤如下:

1.获取类对象 Class class = Class.forName("pojo.Hero");

2.获取构造器对象 Constructor con = clazz.getConstructor(形参.class);

3 获取对象 Hero hero =con.newInstance(实参);


上面是最简单的获取方法,当Hero的构造方法不是无参构造方法时,获取构造器对象略有不同,见下面测试:

构造方法不同时,获取构造器对象的方法

示例:

Hero类添加6种构造方法

//---------------构造方法-------------------

//(默认的构造方法)

Hero(String str){

System.out.println("(默认)的构造方法 s = " + str);

}

//无参构造方法

public Hero(){

System.out.println("调用了公有、无参构造方法执行了。。。");

}

//有一个参数的构造方法

public Hero(char name){

System.out.println("姓名:" + name);

}

//有多个参数的构造方法

public Hero(String name ,float hp){

System.out.println("姓名:"+name+"血量:"+ hp);

}

//受保护的构造方法

protected Hero(boolean n){

System.out.println("受保护的构造方法 n = " + n);

}

//私有构造方法

private Hero(float hp){

System.out.println("私有的构造方法 血量:"+ hp);

}

通过反射机制获取对象:

package test;

public class ConstructorTest {

/*

* 通过Class对象可以获取某个类中的:构造方法、成员变量、成员方法;并访问成员;

*

* 1.获取构造方法:

* 1).批量的方法:

* public Constructor[] getConstructors():所有"公有的"构造方法

public Constructor[] getDeclaredConstructors():获取所有的构造方法(包括私有、受保护、默认、公有)

* 2).获取单个的方法,并调用:

* public Constructor getConstructor(Class... parameterTypes):获取单个的"公有的"构造方法:

* public Constructor getDeclaredConstructor(Class... parameterTypes):获取"某个构造方法"可以是私有的,或受保护、默认、公有;

*


* 2.创建对象

* Constructor对象调用newInstance(Object... initargs)

*/

public static void main(String[] args) throws Exception {

//1.加载Class对象

Class clazz = Class.forName("pojo.Hero");

//2.获取所有公有构造方法

System.out.println("**********************所有公有构造方法*********************************");

Constructor[] conArray = clazz.getConstructors();

for(Constructor c : conArray){

System.out.println(c);

}

System.out.println("************所有的构造方法(包括:私有、受保护、默认、公有)***************");

conArray = clazz.getDeclaredConstructors();

for(Constructor c : conArray){

System.out.println(c);

}

System.out.println("*****************获取公有、无参的构造方法*******************************");

Constructor con = clazz.getConstructor(null);

//1>、因为是无参的构造方法所以类型是一个null,不写也可以:这里需要的是一个参数的类型,切记是类型

//2>、返回的是描述这个无参构造函数的类对象。

System.out.println("con = " + con);

//调用构造方法

Object obj = con.newInstance();

System.out.println("******************获取私有构造方法,并调用*******************************");

con = clazz.getDeclaredConstructor(float.class);

System.out.println(con);

//调用构造方法

con.setAccessible(true);//暴力访问(忽略掉访问修饰符)

obj = con.newInstance(100);

}

}

输出:

**********************所有公有构造方法*********************************

public pojo.Hero(java.lang.String,float)

public pojo.Hero(char)

public pojo.Hero()

************所有的构造方法(包括:私有、受保护、默认、公有)***************

private pojo.Hero(float)

protected pojo.Hero(boolean)

public pojo.Hero(java.lang.String,float)

public pojo.Hero(char)

public pojo.Hero()

pojo.Hero(java.lang.String)

*****************获取公有、无参的构造方法*******************************

con = public pojo.Hero()

调用了公有、无参构造方法执行了。。。

******************获取私有构造方法,并调用*******************************

private pojo.Hero(float)

私有的构造方法 血量:100.0


综上所述,我们能够得出以下结论:

1.获取构造器对象方法:

1).批量的方法:

public Constructor[] getConstructors():所有"公有的"构造方法

public Constructor[] getDeclaredConstructors():获取所有的构造方法(包括私有、受保护、默认、公有)

2).获取单个的方法:

public Constructor getConstructor(Class… parameterTypes): 获取单个的"公有的"构造方法

public Constructor getDeclaredConstructor(Class…parameterTypes):获取"某个构造方法"可以是私有的,或受保护、默认、公有;


以上就是关于利用Java反射机制来获取对象的介绍,当然这只是Java反射机制的一个很小的用处,Java反射是Java中的一个重点内容,想要更深入学习Java反射机制的小伙伴可以观看本站的Java基础教程解锁Java机制的更多精彩内容!


选你想看

你适合学Java吗?4大专业测评方法

代码逻辑 吸收能力 技术学习能力 综合素质

先测评确定适合在学习

在线申请免费测试名额
价值1998元实验班免费学
姓名
手机
提交