A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

在JAVA中有一个类Class它是可以描述JAVA中所有类的一个类,也就是说可以通过它来访问JAVA类里面的东西。

在Class 这个类它也是一个类自然会具有类的属性,既然它可以访问所有类里面的东西,那么它身上就一定有一些方法了。
例如:
getMethod()、getConstructor()、getPackage()等一些方法,通过Class身上的这些方法就可以返回类里面的东西了。
创建一个类就会把这个二进制数据编译成class文件放在硬盘里面,把这些二进制的代码也就是字节码加载到内存里面去,才可以创建一个个的对象。

Class这个比较特殊的类他没有构造方法,他只能接受类的字节码也就是说想要获取他的实例对象只有接受一个类的字节码。
获取字节码的方式有三种。通过类获取。通过对象获取、通过Class类中的静态方法接受一个类名来获取。

Person p1 = new Person();
Person p2 = new Person();
Data

Class cl1 = Data.class  //通过类名获取。
Class cl2 = p1.getClass()  //通过对象获取。

Class cl3 = Class。forName("java.lang.String") //通过静态方法获取类的字节码已经加载到内存里面来了,就不需要自己在加载了。

Class里面有一些方法可以判断类的类型:

isPrimitive()来判断是不是基本类型 基本类型一共有八个 int flaot long double char byte short boolean

System.out.println(int.class.isPrimitive)//  打印true;
.........
System.out.println(int.class == Integer.class)// 打印false 因为Integer是int的包装类它不是基本类型是一个类。
System.out.println(int.class == Integer.TYPE)// 打印true  TYPE这个常量就代表包装类所包装的那个基本类型的字节码。

System.out.println(int[].class.isPrimitive)//任何类型都可以用一个class表示任何类型都是一份字节码,而他表示的字节码是一个int数组类型的字节码所以这个 打印false了,判断是否是一个数组类型要用isArray()方法System.out.println(int[].class.isArray())来表示。

总之,在源程序中 出现的所有类型,都有各自的Class实例对象,例如 void.class、int[].calss 等......

反射就是把一个java类身上的成分映射成java中相应的类。

例如: //我们先得到一个类的字节码
Clsss cls1 = String.class
//然后通过Class中的相应方法来访问这个类中的成分,并返回一个 类。
Method method1 = cls1.getMthod("charAt",int.class);
//这样就把一个里面的一个charAt方法映射成了一个Method类的一个实例对象。然后就可以通过这个类中的方法对这个进行一系列的操作,这就是反射。

我们先写一个类然后对这个类进行反射
public class Person {
//成员变量
private String age;
private String name;
//构造方法
public Person(String age,String name){
this.name = name;
this,age = age;
}
//打印name 的方法
public static void getNameandAge(String name){
System.out.println(age+name);
}

}


要学习反射就要了解反射的那个类分别是 :

Constructor: 这个是反射构造函数、

Class cls = Person.class;
Constructor constructor = cls.getConstructor(String.class,String.class);这个方法接受参数是要获得的构造方法的参数字类型的节码;
表示这个构造方法的第一个参数是SrtingBuffer类型的
第二个参数是int类型的。

注:这个可以添加一个或多个参数之所以可以这样添加是因为jdk1.5以后新增加的功能可变参数,
可变参数只能在末尾!


Method  :  反射的方法

Method method = cls.getMethod("getNameandAge",String.class)

// 这个方法所接受的参数是一个String字符串他代表方法的名字,因为方法有重构有的参数不一样所以第二 //个参数是一个可变参数接受一个Class字节码。

Field  : 反射的字段
Field field1 = cls.getField("age");
Field field2 = cls.getField("name");
//这个方法所接受的参数是一个String字符串代表字段(成员变量)的名字。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马