Java语法回顾之反射
读了那么多年的书让我明白一个道理。人要稳重,不要想到啥就做啥。做一行越久即使你不会,几年之后慢慢的你也会了,加上一点努力你或许你能成为别人眼中的专家。
反射获取字节码文件
/*
* 反射:在运行状态下,通过class文件对象(Class的对象),去使用构造方法,成员变量,成员方法。
*
* 那么,我们是如何获取到class文件对象的呢?(字节码文件对象)
* A:Object类的getClass()方法。
* B:数据类型的静态的class属性
* C:通过Class类的静态方法forName(String className)
*
* 到底使用哪一种呢?
* 开发中用第三种。自己写例子测试可以使用前两种。
* 因为第三种方式可以结合配置文件使用。
*/
反射获取字节码文件
/**
* 通过反射获取字节码文件
*/
public class MyReflect {
public static void main(String[] args) throws ClassNotFoundException {
MyPerson my = new MyPerson();
Class<? extends MyPerson> myClass = my.getClass();
MyPerson mp = new MyPerson();
Class<? extends MyPerson> aClass = mp.getClass();
System.out.println(myClass.equals(aClass));//true
Class<MyPerson> myPersonClass = MyPerson.class;
System.out.println(aClass==myPersonClass);//true
//第三种,开发时使用的方式
Class aClass1 = Class.forName("cn.itcast_01.MyPerson");
System.out.println(myPersonClass==aClass1);//true
}
}
通过反射获取构造方法
/**
* 反射获取构造方法并使用。
* <p/>
* 构造方法 Constructor
* 成员变量 Field
* 成员方法 Method
*/
public class MyReflect {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
Class<?> aClass = Class.forName("cn.itcast_01.MyPerson");
//获取构造器对象
// 一般我们创建对象,只要一个构造方法就可以了,所以,我们只需要获取一个构造方法即可。
Constructor<?> constructor = aClass.getConstructor();
//带参构造方法
Constructor<?> constructor2 = aClass.getConstructor(int.class,String.class);
//通过Constructor创建实例对象
Object o = constructor.newInstance();
Object hsia = constructor2.newInstance(23, "Hsia");
System.out.println("无参构造"+o);
System.out.println("带参构造"+hsia);
System.out.println("*******************");
}
}
反射获取成员变量并使用
/**
* 获取私有成员变量并使用
*/
public class MyReflectField {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
//获取字节码文件
Class<?> c = Class.forName("cn.itcast_01.MyPerson");
//创建对象
Constructor<?> constructor = c.getConstructor();
Object obj = constructor.newInstance();
//没有设置值之前的obj对象
System.out.println("初始化前的值:" + obj);
//获取共有字段名称
Field age = c.getField("age");
//给共有字段设置值
age.set(obj, 23);
//获取私有字段
Field name = c.getDeclaredField("name");
//暴力访问
name.setAccessible(true);//不要限制我。
name.set(obj, "Hsia");//报错 java.lang.IllegalAccessException:
//设置值后的对象
System.out.println("初始化后的值:" + obj);
}
}
反射获取成员方法并使用
/**
* 获取成员方法并使用。
*/
public class MyReflect {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
//获取字节码文件
Class<?> c = Class.forName("cn.itcast_01.MyPerson");
//创建对象
Constructor<?> constructor = c.getConstructor();
Object obj = constructor.newInstance();
//1.获取成员方法 无参无返回值
Method show = c.getMethod("show");
show.invoke(obj,null);
System.out.println("——————————————————");
//2.获取成员方法 带参无返回值
Method function = c.getMethod("function",String.class);
function.invoke(obj,"Hsia");
System.out.println("——————————————————");
//3.获取成员方法 带参有返回值
Method reutrnValue = c.getMethod("reutrnValue", String.class, int.class);
//return 的返回值
Object hsia = reutrnValue.invoke(obj, "Hsia", 23);
System.out.println(hsia);
System.out.println("——————————————————");
//4.获取私有成员方法
Method helloworld = c.getDeclaredMethod("hello");
//设置暴力访问
helloworld.setAccessible(true);
helloworld.invoke(obj,null);
}
}