java 反射 的概念 和 Constructor 类
[color=red]反射就是把 Java 类中的各种成分映射成相应的 JAVA类。[/color]
JAVA类 就是那个字节码 有包名 getPackage() 后 得到一个类 Packgae
类似的
把 各个方法 映射 成 Method 类
。。。。。。。。。。。。。
先介绍反射 时 用到的最重要的一个 类
Constructor 构造函数
======================================
==========================================
[color=red]反射就是把 Java 类中的各种成分映射成相应的 JAVA类。[/color]
JAVA类 就是那个字节码 有包名 getPackage() 后 得到一个类 Packgae
类似的
把 各个方法 映射 成 Method 类
。。。。。。。。。。。。。
先介绍反射 时 用到的最重要的一个 类
Constructor 构造函数
======================================
package com.ncs;
import java.lang.reflect.Constructor;
public class ReflectTest {
public static void main(String[] args) throws Exception {
//下面这行 有 处理 异常 ClassNotFoundException 谁知道有没有这个类
//这是得到所有的 构造 方法
Constructor[] constructors = Class.forName("java.lang.String").getConstructors();
//得到某一个特定的构造 方法 有 处理 异常 NoSuchMethodException 谁知道有没有这个 构造 方法
//注意,一个类的构造 方法N 多,不可能用 123去指定某一个特定的构造方法,只可以指定 参数
//这里getConstructor(StringBuffer.class);是1.5新的 可变参数 以前是数组类型参数
//现在是 Class<?>... parameterTypes
Constructor constructor = Class.forName("java.lang.String").getConstructor(StringBuffer.class);
//我现在要做一件事情 new String(new StringBuffer("abc"));
//我想用反射做
//上面已经得到了那个 构造函数 ,而且参数也是 StringBuffer的
//Constructor类有一个重要的 方法newInstance(arg0); 每call一次就弄一个新的
//当然,参数不是 StringBuffer也可以编译过,
//编译器只管你这个是 构造 方法么就OK了,管你是什么参数
//编译器还不知道这个constructor是对应参数为StringBuffer的构造函数呢!!
//甚至编译器连这个 constructor 是哪个类的都不管
// 编译器只知道这个是 Constructor 的实例,这个实例有个方法叫newInstance,参数可变
//编译器其他什么都不管
//所以我们还要自己把结果 强制 转化为自己需要的类型(String)
//但是 ,到了 runtime,JVM就清楚的知道了,
//所以有 运行时错误 和 编译时错误之分
//就是说你现在传 一个String类型,compiler不会说你错,但是你一运行,JVM就说不对了
String myString = (String)constructor.newInstance(new StringBuffer("abc"));
//test
System.out.println(myString.charAt(2));
//out c OK!S
//上面的方式有三步,中间需要 constructor
//有人偷懒,因为很多类 都有 规定 必须 要有无参 构造函数,所以有个方法
//Class.newInstance() 直接call 无参 构造函数
String s1 = (String)Class.forName("java.lang.String").newInstance();
}
}
==========================================