反射
JAVA反射机制是在运行状态中,
对于任意一个类,都能够知道这个类的所有属性的方法;
对于任意一个对象,都能够调用它的任意一个方法和属性;
这种动态获取的信息以及动态调用对象的方法的功能称为JAVA语言的发射机制
动态获取类中信息,就是JAVA反射,可以理解为对类的解剖。
…
Class:字节码文件类
- 想要获得一个类的Class对象,有三种方法
//////////////////////////////////////////////////////////////////////////
//1.Object类中的getClass()方法的
//想要用这种方式,必须要明确具体的类,并创建对象。
public static void getClassObject1 ()
{
}Student p = new Student(); Class class1 = p.getClass();
//////////////////////////////////////////////////////////////////////////
//2.任何数据类型都具备一个静态的属性.class来获取其对应的Class对象
//相对1来说更简单,但还是需要明确用到类中的静态成员。
private static void getClassObject2 ()
{
}Class class2 = Student.class;
////////////////////////////////////////////////////////////////////////////
//3.只要通过给定的类的字符串名称就可以获取该类,更为扩展
//可以用Class类中的方法完成,该方法就是forName
public static void getClassObject3 ()
{
}String className = "test.Student"; Class class3 = null; try { //找寻该名称类文件,并加载进内存,并产生Class对象 class3 = Class.forName(className); } catch (ClassNotFoundException e) { e.printStackTrace(); } System.out.println(class3);
//上边的方法是空参构造方法,如果必须要传递参数,就使用Constructor获取该类的构造函数对象
public static void getClassObject3_2 ()
{
}String className = "test.Student"; Class class3 = null; try { class3 = Class.forName(className); Constructor cons = class3.getConstructor(String.class,int.class);// 类型.Class 代表该数据类型的Class对象 Object obj = cons.newInstance("王五",20); } catch (Exception e) { e.printStackTrace(); } System.out.println(class3);
字段的获取
getField():该方法返回一个类或接口的一个公共成员字段
getFields():该方法返回一个类或接口的所有公共成员字段
getDeclaredField():返回包括公共和私有的字段,但不包括继承的字段
getDeclaredFields():返回所有。。。。。
//4.如何获取字段
public static void getFidldDemo()
{
String classname = “test.Student”;
Class class4 = null;
Field f1 = null;
Field f2 = null;
try {
class4 = Class.forName(classname);
//f1 = class4.getField(“name”);//获取共有的字段
f2 = class4.getDeclaredField(“age”);//获取私有的字段
f2.setAccessible(true);//对私有字段的暴力访问
Object obj = class4.newInstance();
f2.set(obj,20);
Object o = f2.get(obj);
System.out.println(o);
}catch (Exception e){
e.printStackTrace();
}
}
函数的获取
getMethod():获取一个方法
getMethods():获取所有方法
invoke():执行方法
//函数的使用
//1.无参函数的使用
Method me1 = class5.getMethod("showName");
Constructor c = class5.getConstructor(String.class,int.class);
Object obj = c.newInstance("哈哈",12);
me1.invoke(obj,null);//这里的null是无参
//2.有参函数的使用
Method me2 = class5.getMethod("show",String.class);//在此处加上参数的class类
Object o = class5.newInstance();
me2.invoke(o,"嘿嘿");