java通过反射创建对象的两种⽅式
我个⼈觉得我⾃⼰是个⽐较粗⼼的⼈,所以各位⼤佬发现有什么不对的地⽅还请留⾔告知
在java中,通过反射创建对象有两种⽅式
1. 使⽤Class对象的newInstance()⽅法来创建对象;
具体步骤是:
1、获取类的Class对象(有三种⽅式可以获取,可以⾃⾏百度⼀下)
2、通过调⽤所获取到的Class对象的newInstance()来获得对象,该⽅法会返回⼀个Object类型的对象,所以还需要强转⼀下;
举个例⼦:
新建⼀个Hog,⾥⾯定义⼀个⽅法getName()输出⼀句话,可以看到运⾏之后控制台输出了青青草原四个字,
package Lin;
public class Pig {
public static void main(String[] args)throws IllegalAccessException, InstantiationException {
//通过类.class的⽅式获取⼀个该类的Class实例
Class hogClass = Hog.class;
//通过调⽤newInstance()⽅法获取⼀个Hog的实例,该⽅法会返回⼀个Object类型的对象并且会抛出两个异常,
Hog hog =(Hog) wInstance();
}
}
class Hog {
public void getName(){
System.out.println("青青草原");
}
}
把上⾯的代码再修改⼀下
修改后的代码在Hog类构造函数中添加了⼀句代码,输出⼀句话,然后运⾏代码,可以发现构造函数被调⽤了,说明在使⽤Class类的newInstance()⽅法获得⼀个类的实例时,依然会调⽤他的(默认)构造函数;
package Lin;
public class Pig {
public static void main(String[] args)throws IllegalAccessException, InstantiationException {
//通过类.class的⽅式获取⼀个该类的Class实例
Class hogClass = Hog.class;
//通过调⽤newInstance()⽅法获取⼀个Hog的实例,该⽅法会返回⼀个Object类型的对象并且会抛出两个异常,
Hog hog =(Hog) wInstance();
}
}
class Hog {
public Hog(){
System.out.println("⽆参构造函数");
}
public void getName(){
System.out.println("青青草原");
}
}
2. 通过Constructor类的newInstance()⽅法获取
具体步骤是
1、获取⼀个类的⼀个Class实例;
2、调⽤Class中的getConstructor()⽅法获得⼀个Constructor对象,
3、调⽤Constructor的newInstance()⽅法获得⼀个类的实例;
再举个例⼦,把上⾯的代码稍微改⼀下:
Hog类中的代码不变,在主⽅法中通过getConstructor()⽅法获得⼀个Constructor类的实例,然后通过Constructor的
newInstance()⽅法获得⼀个类的实例;
getConstructor(Class<?>… parameterTypes)⽅法中可以传递Class类型的参数(不知到Class…的可以把他理解成参数是Class类型的数组),通过传递的参数来获得Class对象所包含的类的指定的public构造⽅法(就是指定的构造⽅法,因为⼀个类可以有好多个构造⽅法,当你的⼀个构造⽅法为public Hog(int a) 时, 那就可以传递int.class进去)想知道的就查相关api吧,
package Lin;
import flect.Constructor;
import flect.InvocationTargetException;
public class Pig {
public static void main(String[] args)throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException { //通过类.class的⽅式获取⼀个该类的Class实例
Class hogClass = Hog.class;
//调⽤Class类的getConstructor()获得⼀个指定的构造器(参数为空则获得默认的构造器)对象注意获得的构造器得是被public修饰的
Constructor constructor =(Constructor) Constructor();
//调⽤Constructor的newInstance()⽅法获取⼀个Hog实例(注意要强转)
Hog hog =(Hog) wInstance();
}
}
class Hog {
public Hog(){
System.out.println("⽆参构造函数");
}
public void getName(){
System.out.println("青青草原");
}
}
运⾏截图:
将上⾯的代码再进⾏修改⼀下
1.在Hog类中定义⼀个带参的构造函数,形参为String类型
2.在主⽅法中调⽤Class的getConstructor()⽅法并传递String.class进去(告诉⽅法我要到⼀个参数 是String类型的构造函数)
3.调⽤Constructor的newInstance()⽅法并传递⼀个String类型的字符串进去(可以理解成就是传递构造函数的参数进去)
运⾏之后可以看到带参数的构造函数被调⽤了;
package Lin;
import flect.Constructor;
import flect.InvocationTargetException;
public class Pig {
public static void main(String[] args)throws NoSuchMethodException, IllegalAccessException, Invoca
tionTargetException, InstantiationException { //通过类.class的⽅式获取⼀个该类的Class实例
Class hogClass = Hog.class;
//调⽤Class类的getConstructor()获得⼀个参数为String类型的构造器对象
Constructor constructor =(Constructor) Constructor(String.class);
//调⽤Constructor的newInstance()⽅法获取⼀个Hog实例(传递⼀个String类型的参数)
Hog hog =(Hog) wInstance("我是Constructor类调⽤的");
}
}
class Hog {
public Hog(){
System.out.println("⽆参构造函数");
}
java接口可以创建对象吗public Hog(String message){
System.out.println(message);
}
public void getName(){
System.out.println("青青草原");
}
}
两种⽅法的区别
第⼀种⽅法、通过Class的newInstance()⽅法只能使⽤默认的构造⽅法,换句话说就是使⽤此⽅法是不能通过带参的构造函数来⽣成⼀个类的实例;
第⼆种⽅法、通过Constructor的newInstance()⽅法可以使⽤默认的构造⽅法,也可以使⽤带参的构造⽅法来⽣成⼀个类的实例
在只有⼀个默认的构造函数(或不带参数的构造函数)时,使⽤第⼀种⽅法⽐较⽅便,如果要使⽤类中的其他构造⽅法那只能使⽤第⼆种⽅法了。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论