本帖最后由 王文博 于 2014-9-20 23:41 编辑
- <p><p><p>个人总结了一下,不知道你能不能看得懂。</p><p>
- Constructor类代表某个类中的一个构造方法;</p><p>
- import java.lang.reflect.Constructor;
- 得到某个类中所有的构造方法:
- public class Reflect
- {
- public static void main(String[] args) throws Exception
- {
- /* new String(new StringBuilder("abc"));
- * 用StringBuilder对象传给String构造方法,用这个构造方法在new String()
- * 现在我们要用反射的方式,实现同样的效果:
- * 先拿到构造方法:String.class代表一个字节码(对象),对象名.getConstructor拿到这个类的构造方法
- * 再拿到这个构造方法里的参数StringBuilder类型,最后返回给这个对象的相对应的类型 Constructor
- */
- Constructor cons = String.class.getConstructor(StringBuilder.class);
- /* 这俩行代码用了俩个StingBuilder,第一个表示:StringBuilder选择什么参数的构造方法[是类型] </p><p> * 第二个表示:用这个构造方法时候还要传递与之对应的对象进去[是对象]
- * newInstance是new一个构造方法,如果里面有参数一定不能忘了写![cons.newInstance("abc");错误示范]
- */
- String str = (String)cons.newInstance(new StringBuilder("abc"));
- System.out.println(str.charAt(2)); //c
- /*
- * 分析这三行代码执行:
- * 在编译期间,严格进行语法检查,并没有执行"="号右边的代码,只是生成二进制代码(0101),放进内存里,并没有执行;
- * 编译期间只知道是一个构造方法,并不知道是哪个类上的构造方法,因为newInstance返回类型是Object</p><p> * 而这个构造方法返回的是String类型,所以要强制转换成相应类型;
- * 在运行期间,才会执行"="号右边的代码,
- */
- }
- } </p>
复制代码
|