java 反射获取构造器详细

  • Post author:
  • Post category:java


第一种: 知道类名,调用Class的forName方法,比如 Class.forName(“java.lang.String”)

例如 中间的类名 是完整的类名 Javafanse 是一个包 包里面有个类,它的名字是Student

第二种: 也是知道类名,调用它的class ,比如 : Class cls = String.class

Student是个类,我自己写的

第三种: 知道对象 调用它的getClass方法, 比如:String str = ‘123’; Class cls = str.getClass();

通过上面 ,我们知道通过某个类 , 获取它对应的Class 对象,比如String.class  返回的是 Class 对象,我们就把这个返回的值,赋值给Class cls变量,这个对象其实就是String ,类其实是Class的对象。

就像我们自己写了个Student类,然后 new Student(); 那么new Student() 就是Student类的一个对象,同理 String类, Integer类,自己写的Student类 ,等等。这些其实也是对象,只不过它们都是Class类的对象。

我们已经拿到的某个类(通过上面的3个方法之一),对应与它的Class对象,我们就可以用这个对象去执行一些方法,获取我们想要的东西,比如构造方法。

我们知道了这个类名,然后用Class方法获得了,这个类对应在Class的对象。

我就只讲构造方法,我第一步当然想知道,这类有哪些构造方法啊!!!

这是一个类,有四个构造方法

Class c1=Student.class; 这条语句获取Student对应在Class中的对象。
c1.getConstructors();//该方法获取public修饰的构造方法 注意,只能是public修饰的,不是,就获取不了
c1.getDeclaredConstructors()//该方法获取所有的构造方法,包括private



现在我们知道了 类一共有哪些构造方法了

现在我们要求有点特殊 ,我要的构造方法有条件,这个条件是 参数是String 和int 的,其他的我都不要,那么有这个方法

 c1.getConstructor(String.class, int.class);//这个方法可以指定获取构造方法
//该构造方法 第一个参数是字符串类型,第二个参数是int类型
//当然还可以有其他类型,但是,找不到就报错。
//但是这是获取public修饰的,private 和protected 修饰的和默认的不行


c1.getDeclaredConstructor(String.class,int.class);//这个方法不管用什么修饰,都可以获取到构造方法
//一句话就是,获取某个类的所有的构造方法,但是这个构造方法有条件限制,参数是字符串,然后是整型

你仔细看,我那些方法其实都没有赋值,比如,c1.getDeclaredConstructor(String.class,int.class);

这个语句左边没有=

Constructor con=c1.getDeclaredConstructor(String.class,int.class);

像这样。

这条语句 =号右边 c1表示Class类的对象,这个对象是Student类。

调用了get什么什么方法  然后填了参数,表示,找一个构造方法,这个构造方法,第一个参数是字符串,第二个方法是 int类型

找到就继续执行赋值,没有就报错

然后接下来,我将要通过 获取到的构造方法 ,用构造方法来创建一个对象,这个对象是Student类的对象。

con.newInstance("你好",2);

//看到了吧,con是刚刚获得的某个构造方法 然后调用newInstance方法,con的构造方法参数是怎么样的,你的newInstance方法的参数就要怎么传进去,第一个参数 你好 是字符串,第二个是 整型 数字2

是因为

你刚刚就是这么获得的某个具体的构造方法啊   ,具体 就是 你都知道 第一个参数是字符串,第二个参数是 整型 数字。还不具体啊?

好了,这篇文章说了

知道字节码文件 获取这个文件 的构造方法有哪些。字节码懂吗? 不是java源代码 你不会想在字节码里面写java代码 ,或者以为 打开字节码文件 看看里面 有哪些构造方法吧?打开也看不懂,不是java源代码,有人说反编译,那如果不反编译能做到吗?

当然可以通过类名.class 获取Class对应的对象

还可以通过对象getClass方法获得

三个其实获得的都是同一个东西

这个同一个东西 去调用 getDeclaredConstructor方法 获得这个类的 所有的 构造方法

然后,在很多的构造方法中 挑选一个构造方法

这个构造方法 再去调用 newInstance方法  就可以得到 这类的一个对象。

于是我们只知道这类名,就到了 new 了一个   对象出了,而且这个对象还是这个类的

!!!

这样岂不是感觉有点危险的感觉,之后还可以用这个对象 去调用方法!!干其他事情



版权声明:本文为qq_46506007原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。