Constructor是用来管理所有的构造函数的类.
Field是用来管理所有属性的类.
JDK文档说明:
java.lang.reflect
类 Constructor<T>
java.lang.Object
java.lang.reflect.AccessibleObject
java.lang.reflect.Constructor<T>
类型参数:
-
T
- 在其中声明构造方法的类。
所有已实现的接口:
-
AnnotatedElement,
GenericDeclaration,
Member
-
public final class Constructor<T>
extends
AccessibleObject
implements
GenericDeclaration,
Member
Constructor
提供关于类的单个构造方法的信息以及对它的访问权限。
Constructor
允许在将实参与带有底层构造方法的形参的 newInstance() 匹配时进行扩展转换,但是如果发生收缩转换,则抛出 IllegalArgumentException
。
java.lang.reflect
类 Field
java.lang.Object
java.lang.reflect.AccessibleObject
java.lang.reflect.Field
所有已实现的接口:
-
AnnotatedElement,
Member
-
public final class Field
extends
AccessibleObject
implements
Member
Field
提供有关类或接口的单个字段的信息,以及对它的动态访问权限。反射的字段可能是一个类(静态)字段或实例字段。
Array
允许在执行 get 或 set 访问操作期间进行扩展转换,但如果将发生收缩转换,则抛出一个 IllegalArgumentException
。
package pengesoft.sun.pack;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
public class ReflectTest {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchFieldException {
// TODO Auto-generated method stub
String str1 = "abc"; //String为一个类,而不是基本类型
Class cls1 = str1.getClass();
Class cls2 = String.class;
Class cls3 = Class.forName("java.lang.String");
System.out.println(cls1 == cls2); //
System.out.println(cls1 == cls3); //——true三个对象都具有相同的字节码,JVM中只保留一份该字节码,用该字节码可以创建多个对象
System.out.println(cls1.isPrimitive()); //String不是基本类型,返回false;
System.out.println(int.class.isPrimitive()); //int为基本类型,返回true;
System.out.println(int.class == Integer.class); //int和Integer为不同的类型,有不同的字节码 ——false
System.out.println(int.class == Integer.TYPE); //TYPE常量返回该类的基本类型—— true
System.out.println(int[].class.isPrimitive()); //数组不是原始类型,故返回false
System.out.println(int[].class.isArray()); //判断是否是数组 ——true
//Constructor的反射 2012-4-10 18:25:23 sun
//利用已知的构造方法创建对象实例
String str2 = new String(new StringBuffer("ABC"));
System.out.println(str2.charAt(2));
//利用Class类根据参数类型来获取构造方法
//Class -> Construtor -> new Object
Constructor constructor1 = String.class.getConstructor(StringBuffer.class); //Class -> Constructor
//Constructor -> new Object
String str3 = (String) constructor1.newInstance(new StringBuffer("ABCD")); //此处的参数对应为获得的构造方法参数类型对应的对象,不能传入字符串 "ABCD"
System.out.println(str3.charAt(3));
//Field类的反射 2012-4-10 18:25:27 sun
ReflectPoint pt1 = new ReflectPoint(3, 5);
Field fieldY = pt1.getClass().getField("Y");
//filedY的值是不是5?不是,fieldY是类的变量,而不是对象的变量,不代表具体的值。
System.out.println(fieldY.get(pt1)); //取值
//Field fieldX = pt1.getClass().getField("X"); //报错,不能得到private的变量
Field fieldX = pt1.getClass().getDeclaredField("X"); //访问所有的成员用getDeclaredField方法
//System.out.println(fieldX.get("X")); //错误,不能访问成员的值
fieldX.setAccessible(true); //设置成员可以访问 —————暴力反射
System.out.println(fieldX.get(pt1)); //OK 可以访问了
}
}
package pengesoft.sun.pack;
public class ReflectPoint {
private int X;
public int Y;
public ReflectPoint(int x, int y) {
super();
X = x;
Y = y;
}
}