黑马程序员--Java笔记16--反射

来源:互联网 发布:mac 英文界面 编辑:程序博客网 时间:2024/05/29 03:22
------- android培训、java培训、期待与您交流! ----------

反射:将Java类中的成分抽取出来映射成对象

Class 

Class类的实例对象对应各个类在内存中的字节码

Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的。 

得到字节码的实例对象3种方法:

1.类名.class

2.对象.getClass()   // new Date().getClass()

3.Class.forName(“类名”)//Class.forName(“java.util.Date”)

九个预定义实例对象

包括八个基本类型和Void//int.class==Integer.TYPE;

数组类型Class实例对象:Class.isArray();

Method 

得到类中的方法:

Method charAt=Class.forName(“java.lang.String”).getMethod(“charAt”,int.class);

charAt.invoke(str,1);//str==null,说明该方法是静态方法(用invoke调用方法)

练习:调用函数的main方法:

String name=args[0];//需要在运行前输入变量

Method m=Class.forName(name).getMethod("main", String[].class);

m.invoke(null,(Object)new String[]{});//main方法为静态的不需要传递对象Constructor

得到类中的构造函数:

所有构造函数:Constructor[] con=Class.forName(“java.lang.String”).getConstructor();

某一个:Constructor con=Class.forName(“java.lang.String”).getConstructor(StringBuffer.class);

创建实例对象:

String str=(String)constructor.newinstance(new StringBuffer(“aaa”));

Field

得到类中的成员变量:

Feild f1=obj.getClass().getField(x);//获取x变量

Feild[] f=obj.getClass().getFields();//获得所有成员变量

练习:需求:将一个对象中所有String类型成员变量中的‘b’替换成‘a

 

private static void change_b2a(Object obj) throws Exception {

Field[] f1=obj.getClass().getFields();//获取所有成员变量

for(Field f:f1){

if(f.getType()==String.class){//如果是String类型

String sold=(String) f.get(obj);//get()方法获得

String snew=sold.replace('b','a');

f.set(obj, snew);//set()方法设置为新的值

}

}

}

数组的反射

//数组的反射

int []a1=new int[2];

int []a2=new int[3];

int [][]a3=new int[2][3];

String []a4=new String[2];

System.out.println(a1.getClass() == a2.getClass());//true

System.out.println(a1.getClass().getSuperclass() == a3.getClass().getSuperclass());//true

System.out.println(a1.getClass().getSuperclass() == a4.getClass().getSuperclass());//true

System.out.println(a1.getClass().equals(a3.getClass()));//false

//System.out.println(a1.getClass()==a4.getClass());//不兼容

System.out.println(a1.getClass().getName());//[I

System.out.println(a1.getClass().getSuperclass());//class java.lang.Object


0 0