Constructor是用来管理所有的构造函数的类.
Field是用来管理所有属性的类.
<wbr></wbr>
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<wbr></wbr>
。
<wbr></wbr>
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<wbr></wbr>
。
<wbr></wbr>
package pengesoft.sun.pack;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetExceptio<wbr>n;</wbr>
public class ReflectTest {
<wbr><br><wbr>public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException<wbr>, InvocationTargetExceptio<wbr>n, NoSuchFieldException {<br><wbr><wbr>// TODO Auto-generated method stub<br><wbr><wbr>String str1 = "abc";<wbr> //String为一个类,而不是基本类型<br><wbr><wbr>Class cls1 = str1.getClass();<br><wbr><wbr>Class cls2 = String.class;<br><wbr><wbr>Class cls3 = Class.forName("java.lang.String");<br><wbr><wbr>System.out.println(cls1 == cls2);<wbr><wbr> //<br><wbr><wbr>System.out.println(cls1 == cls3);<wbr><wbr> //——true三个对象都具有相同的字节码,JVM中只保留一份该字节码,用该字节码可以创建多个对象<br><wbr><wbr>System.out.println(cls1.isPrimitive());<wbr> //String不是基本类型,返回false;<br><wbr><wbr>System.out.println(int.class.isPrimitive());<wbr> //int为基本类型,返回true;<br><wbr><wbr>System.out.println(int.class == Integer.class); //int和Integer为不同的类型,有不同的字节码 ——false<br><wbr><wbr>System.out.println(int.class == Integer.TYPE);<wbr> //TYPE常量返回该类的基本类型—— true<br><wbr><wbr>System.out.println(int[].class.isPrimitive()); //数组不是原始类型,故返回false<br><wbr><wbr>System.out.println(int[].class.isArray());<wbr> //判断是否是数组 ——true<br><wbr><wbr><br><wbr><wbr><br><wbr><wbr>//Constructor的反射 2012-4-10 18:25:23 sun<br><wbr><wbr><br><wbr><wbr>//利用已知的构造方法创建对象实例<br><wbr><wbr>String str2 = new String(new StringBuffer("ABC"));<br><wbr><wbr>System.out.println(str2.charAt(2));<br><wbr><wbr><br><wbr><wbr>//利用Class类根据参数类型来获取构造方法<br><wbr><wbr>//Class -> Construtor -> new Object<br><wbr><wbr>Constructor constructor1 = String.class.getConstructor(StringBuffer.class); //Class -> Constructor<br><wbr><wbr>//Constructor -> new Object<br><wbr><wbr>String str3 = (String) constructor1.newInstance(new StringBuffer("ABCD"));<wbr> //此处的参数对应为获得的构造方法参数类型对应的对象,不能传入字符串<wbr>"ABCD"<br><wbr><wbr>System.out.println(str3.charAt(3));<br><wbr><wbr><br><wbr><wbr>//Field类的反射 2012-4-10 18:25:27 sun<br><wbr><wbr>ReflectPoint pt1 = new ReflectPoint(3, 5);<br><wbr><wbr>Field fieldY = pt1.getClass().getField("Y");<br><wbr><wbr>//filedY的值是不是5?不是,fieldY是类的变量,而不是对象的变量,不代表具体的值。<br><wbr><wbr>System.out.println(fieldY.get(pt1));<wbr><wbr> //取值<br><wbr><wbr><br><wbr><wbr>//Field fieldX = pt1.getClass().getField("X"); //报错,不能得到private的变量<br><wbr><wbr>Field fieldX = pt1.getClass().getDeclaredField("X");<wbr> //访问所有的成员用getDeclaredField方法<br><wbr><wbr>//System.out.println(fieldX.get("X"));<wbr><wbr> //错误,不能访问成员的值<br><wbr><wbr>fieldX.setAccessible(true);<wbr> //设置成员可以访问<wbr><wbr><wbr> —————暴力反射<br><wbr><wbr>System.out.println(fieldX.get(pt1));<wbr> //OK 可以访问了<br><wbr>}<br> }<br></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
package pengesoft.sun.pack;
public class ReflectPoint {
<wbr>private int X;<br><wbr>public int Y;<br><wbr>public ReflectPoint(int x, int y) {<br><wbr><wbr>super();<br><wbr><wbr>X = x;<br><wbr><wbr>Y = y;<br><wbr>}<br> }<br></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>