详解Java反射创建对象

网友投稿 248 2023-01-11

详解Java反射创建对象

一、什么是反射

java Reflaction in Action中的解释:反射是运行中的程序检查自己和软件运行环境的能力,它可以根据它发现的进行改变。通俗的讲就是反射可以在运行时根据指定的类名获得类的信息 个人理解:就是我们对于创建对象我们除了通过 new关键字创建外,还能通过什么创建呢?private的属属性真的不能获取吗?反射就能做到打破这些所谓的规则反射和new创建对象谁的效率高? new

二、通过类对象调用newInstance()方法,适用于无参构造方法

2.1 类名.class

public class Main {

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

Class clazz = Person.class;

Person person = clazz.newInstance();

System.out.println(person instanceof Person); // true

}

}

class Person {

private Integer age;

private String name;

public Person() {

}

}

2.2 Class.forName

public class Main {

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

Class> clazz = Class.forName("com.best.test.Person");

Person person = (Person) clazz.newInstance();

System.out.println(person instahttp://nceof Person); // true

}

}

class Person {

private Integer age;

private String name;

public Person() {

}

}

2.3 对象名.getClass

public class Main {

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

Person person = new Person();

Class extends Person> clazz = person.getClass();

Person person1 = clazz.newInstance();

System.out.println(person1 instanceof Person); // true

}

}

class Person {

private Integer age;

private String name;

public Person() {

}

}

三、getConstructor()和getDeclaredConstructor()

通过类对象的getConstructor()或getDeclaredConstructor()方法获得构造器(Constructor)对象并调用其newInstance()方法创建对象,适用于无参和有参构造方法。

3.1 getConstructor()

public class Main {

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

Class clazz = Person.class;

Constructor ctor = clazz.getConstructor(Integer.class, String.class);

Person person = ctor.newInstance(26, "jak");

System.out.println(person instanceof Person); // true

}

}

class Person {

private Integer age;

private String name;

public Person(Integer age, String name) {

this.age = age;

this.name = name;

}

}

3.2 getDeclaredConstructor()

public class Main {

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

Class clazz = Person.class;

Constructor ctor = clazz.getDeclaredConstructor(String.class);

Person person = ctor.newInstance("jak");

System.out.println(person instanceof Person); // true

}

}

class Person {

private Integer age;

private String name;

public Person(Integer age, String name) {

this.age = age;

this.name = name;

}

public Person(String name) {

this.name = name;

}

}

3.3 getConstructor()和getDeclaredConstructor()区别

getDeclaredConstructor(Class>... parameterTypes)

这个方法会返回指定参数类型的所有构造器,包括public的和非public的,当然也包括private的。getDeclaredConstructors()的返回结果就没有参数类型的过滤了。

再来看getConstructor(Class>... parameterTypes)

这个方法返回的是上面那个方法返回结果的子集,只返回指定参数类型访问权限是public的构造器。getConstructors()的返回结果同样也没有参数类型的过滤。

参考文章

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:国内航空快递物流查询单号(国内航空快递物流查询单号官网)
下一篇:java并发编程工具类JUC之ArrayBlockingQueue
相关文章

 发表评论

暂时没有评论,来抢沙发吧~