1.Class的获取方法
万物皆对象,Class类表示一个类对应的字节码文件,一般有三种方法来获得,
例: String str= “abc”;
Class clas1= str.getclass();
Class clas2 = String.class;
Class clas3 =Class.forName(“java.lang.String”);
System.out.println(clas1==clas2);
//结果为true;
System.out.println(clas1==clas3);
//结果为true,说明这三个类是一样的
Java中默认有9个Class类即8个数据类型加上void对应的字节码文件。
2.Class类的类型判断方法
(1)isPrimitive()判断是否是基本数据类型的字节码文件
Int.class.isPrimitive()//结果为true
String.class.isPtrimitive()//结果为false,因为String不是基本数据类型
Int.class== Integer.class//false ,各有各的对应字节码文件,但如果Integer包装一个基本数据又不一样了例如:int.class== Integer.TYPE结果为true
(2)isArray()
判断是否是数组类型的Class实例对象
Int[].class.isArray() //结果为true
3.什么是反射
反射是把java类中的各种成分映射成相应的java类。一个类中的每个成员都可以用相应的反射API类的一个实例对象来表示,通过调用Class类的方法可以得到这些实例对象。
4.构造方法的反射应用
Constructor类代表某个类中的一个构造方法:
得到String类的所有构造方法
Constructor[] constructors= Class.forName(“java.lang.String”).getConstructors();
得到String类的某一个构造方法:
Constructor constructor = Class.forName(“java.lang.String”).getConstructor(StringBuffer.class);
通过构造方法来获取类:通过字节码文件的newinstance(构造方法的参数)
Object obj= Constructor.newinstance(newStringBuffer(“abc”))
注意是object类型
5.成员变量的反射
Filed类代表某一个类的一个成员变量
Class Reflect {
private int x; public int y;
public Reflect(int x,int y ){this.x=x;this.y=y;}
}
Class Text{
public static void mian(String[] args){
Reflect rf= new Reflect(3,5);
Field fieldY= rf.getClass().getField(“y”);
//fieldY的值不为5,它仅仅代表y不代表类上变量的值
fieldY.get(rf)//结果是5
如果取私有的,则
Field fieldX = rf.getClass().getDeclaredField(“x”);
仅仅使其可见,但不能用,要通过暴力反射是由
FieldX.setAccessible(true);
FieldX.get(rf) 此时,私有的x的值可以被访问,结果为3
}
6.成员方法的反射
Method类代表某个类的一个成员方法
得到类中的一个方法
Method method = Class.forName(“java.lang.String”).getMethod(“method”,参数列表)
使用方法 method.invoke(Object obj,参数列表);
如果obj处被null代替说明该方法是静态的,不需要通过对象直接调用
本文深入探讨Java中的反射机制,包括Class类的获取方法、类型判断、构造方法的应用、成员变量和成员方法的反射操作。详细解释了如何通过反射API获取和操作类、对象及其成员。

被折叠的 条评论
为什么被折叠?



