Constructor类和Field类的反射

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;
 }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值