Constructor类和Field类的反射

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 -&gt; Construtor -&gt; new Object<br><wbr><wbr>Constructor constructor1 = String.class.getConstructor(StringBuffer.class); //Class -&gt; Constructor<br><wbr><wbr>//Constructor -&gt; 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>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值