美文网首页
反射获得构造方法创建对象

反射获得构造方法创建对象

作者: George_Antonio | 来源:发表于2017-12-25 10:24 被阅读0次

本篇文章将分为两部分:

1、通过反射获取类的构造方法

获取某一个类中的所有的构造器,通常分为两个步骤:

①明确操作的是哪一份字节码对象

②获取构造器

Class类获取构造器方法:

Constructor类:表示类中构造器的类型,Constructor的实例就是某一个类中的某一个构造器

public Constructor<?>[] getConstructors():该方法只能获取当前Class所表示类的public修饰的构造器

public Constructor<?>[] getDeclaredConstructors():获取当前Class所表示类的所有的构造器,和访问权限无关

public Constructor<T> getConstructor(Class<?>... parameterTypes):获取当前Class所表示类中指定的一个public的构造器

参数:parameterTypes表示:构造器参数的Class类型

如:

public User(String name) Constructor c = clz.getCOnstructor(String.class);

public Constructor<T> getDeclaredConstructor(Class<?>...parameterTypes):获取当前Class所表示类中指定的一个的构造器,和访问权限无关


class User {
public User() {}
public User(String name) {}
private User(String name, int age) {}
}
public class ConstructorDemo {
public static void main(String[] args) throws Exception {
    //1、先找到被调用构造器所在类的字节码
    Class<User> clz = User.class;
    //2、获取所有构造器
    Constructor<?>[] cs = clz.getConstructors();
    for (Constructor<?> constructor : cs) {
        System.out.println(constructor);
    }
    System.out.println("---------------------------");
    //2、获取指定公有带参数构造器(获取指定公有构造器)
    Constructor<?> c = clz.getConstructor(String.class);
    System.out.println(c);
    System.out.println("---------------------------");
    //获取指定公有无参数构造器(获取指定公有构造器)
    c = clz.getConstructor();
    System.out.println(c);
    System.out.println("---------------------------");
    //2、获取指定私有构造器
    c = clz.getDeclaredConstructor(String.class,int.class);
    System.out.println(c);
}
}

当我们在代码中添加如下代码:


c = clz.getDeclaredConstructor(int.class);

System.out.println(c);

表示:在User中没有找到带有int类型的构造器

2、创建对象

调用构造器,创建对象:

Constructor<T>类:表示类中构造器的类型,Constructor的实例就是某一个类中的某一个构造器

常用方法:

public T newInstance(Object...initargs):如调用带参数的构造器,只能使用该方式.

参数:initargs:表示调用构造器的可变实际参数

返回:返回创建的实例,T表示Class所表示类的类型

如果:一个类中的构造器可以直接访问,同时没有参数.,那么可以直接使用Class类中的newInstance方法创建对象.

public Object newInstance():相当于new 类名();

class User {
public User() {
    System.out.println("User()");
}
public User(String name) {
    System.out.println("User(String name)   " + "name = "+name);
}
private User(String name, int age) {
    System.out.println("User(String name, int age)   " + "name = "+name+"  age = "+age);
}
}
public class ConstructorDemo {
public static void main(String[] args) throws Exception {
    //1、先找到被调用构造器所在类的字节码
    Class<User> clz = User.class;
    //2、获取指定公有带参数构造器(获取指定公有构造器)
    Constructor<?> c = clz.getConstructor(String.class); //
    //3、实例化对象
    c.newInstance("huangweiyong");
    System.out.println("---------------------------");
    //获取指定公有无参数构造器(获取指定公有构造器)
    c = clz.getConstructor();
    //3、实例化对象
    c.newInstance();
    System.out.println("---------------------------");
    //直接调用Class类的newInstance方法构造对象
    //3、实例化对象
    clz.newInstance();
    System.out.println("---------------------------");
    //、获取指定私有构造器
    c = clz.getDeclaredConstructor(String.class,int.class);
    //设置私用方法的可访问(切记,这里必须设置,否则会抛出下图的异常)
    c.setAccessible(true);
    //3、实例化对象
    c.newInstance("huangweiyong",18);
}
}

c.setAccessible(true);如果上述代码在调用私有构造函数时没有设置成true或者不写,会抛出异常:
上述异常的原因是:不能够访问User类中一个修饰符为private的成员.

为了安全性考虑,private成员外界不准访问.

但是问题是,我偏要访问:此时就要告诉成员在运行期间忽略掉该安全检查.

解决方案:调用AccessibleObject类中的

publicvoid setAccessible(boolean flag)方法:设置是否可访问

setAccessible(true):可访问的

又因为ConstructorAccessibleObject子类,所以Constructor中具有该方法.

(这一点千万不要忘记,切记切记!!!!!!)

作者:老勇
链接:https://www.jianshu.com/p/60e622123c7c
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

相关文章

  • 反射获得构造方法创建对象

    本篇文章将分为两部分: 1、通过反射获取类的构造方法 获取某一个类中的所有的构造器,通常分为两个步骤: ①明确操作...

  • java基础(一)反射注解泛型

    反射 1.反射拿到构造函数 2.通过构造去创建对象 3.反射获取属性修改属性 4.反射执行私有方法 注解 1.Re...

  • java 反射

    什么是反射 反射的作用 反射的应用场景 获取Class对象 获取属性 5.获取方法 6.获取构造 7.创建对象 8...

  • [Effective Java] (01)静态工厂方法代替构造器

    1. 创建对象 1.1 构造方法创建对象 在Java中,创建对象常用的方法是通过公有的构造方法创建;如:Boole...

  • 反射、Class类、Field类、Method类

    反射 Class类 Class类没有公共构造方法,所有创建Class的对象的方法有以下几种: 1.通过Class....

  • 面向对象(二)

    深入构造器 构造器用于在创建实例时执行初始化。构造器是创建对象的重要途径(即使使用工厂模式、反射等方式创建对象,其...

  • JS创建对象方法之工厂方法,构造函数方法

    JS创建对象方法之工厂方法,构造函数方法 我们在ECMAScript中创建对象虽然可以通过Object()构造方法...

  • 链式操作

    对象字面量创建对象 构造函数创建对象 构造函数和原型一起创建对象 参考 JavaScript设计模式 --- 方法...

  • Java反射与joor反射库的使用

    java原生反射的使用 反射构造对象 反射方法 反射字段 joor反射库的使用 github:https://gi...

  • 06-Java反射面试题(11题)

    1、除了使用new创建对象之外,还可以用什么方法创建对象? 使用Java反射可以创建对象! 2、Java反射创建对...

网友评论

      本文标题:反射获得构造方法创建对象

      本文链接:https://www.haomeiwen.com/subject/brakgxtx.html