反射的使用
代碼示例:
public class ReflectionTest {
public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException, ClassNotFoundException, IOException {
//利用反射實現操作
Class manClass = Man.class;
//利用反射創建Man類對象
Constructor constructor=manClass.getConstructor(String.class,int.class);
Object object=constructor.newInstance("Roy",22);
Man man=(Man)object;
System.out.println(man.toString());
//通過反射調用對象指定的屬性、方法
Field age = manClass.getDeclaredField("age");
age.set(man,10);
//調用方法
Method show = manClass.getDeclaredMethod("show");
show.invoke(man);
//通過反射可以調用私有方法、屬性、構造器
//調用私有構造器
Constructor constructor1=Man.class.getDeclaredConstructor(String.class);
constructor1.setAccessible(true);
Man sky =(Man) constructor1.newInstance("Sky");
System.out.println(sky);
//調用私有屬性
Field name = manClass.getDeclaredField("name");
name.setAccessible(true);
name.set(sky,"Roy");
System.out.println(sky);
//調用私有方法
Method showNation = manClass.getDeclaredMethod("showNation", String.class);
showNation.setAccessible(true);
showNation.invoke(sky,"China");
//獲取Class實例的方式
//方式一:
Class clazz=Man.class;
System.out.println(clazz);
//方式二:
Man m1=new Man();
m1.getClass();
System.out.println(m1.getClass());
//方式三:調用Class的靜態方法
Class clazz1= Class.forName("cn.com.java.Man");
System.out.println(clazz1);
//方式四:使用類的加載器
ClassLoader classLoader=ReflectionTest.class.getClassLoader();
Class clazz2 = classLoader.loadClass("cn.com.java.Man");
System.out.println(clazz2);
//使用ClassLoader加載配置文件
Properties properties=new Properties();
/* //讀取配置文件方式一:
FileInputStream fis=new FileInputStream("Day20\\jdbc.properties");
properties.load(fis);*/
//讀取配置文件方式二:
ClassLoader classLoader1=ReflectionTest.class.getClassLoader();
InputStream is=classLoader1.getResourceAsStream("jdbc1.properties");
//默認文件位置識別在當前module的src下
properties.load(is );
//獲取屬性值
String user=properties.getProperty("user");
String password=properties.getProperty("password");
System.out.println("user "+user+"password "+password);
}
}
通過反射創建對應的運行時類的對象
代碼示例:
public class InstanceTest {
public static void main(String[] args) throws IllegalAccessException, InstantiationException, NoSuchFieldException, NoSuchMethodException, InvocationTargetException {
Class<Man> clazz=Man.class;
/*調用newInstance()方法創建對應的運行時類對象
內部調用了運行時類的空參構造器*/
Man man = clazz.newInstance();
System.out.println(man);
/*
*調用運行時類的指定結構:屬性、方法、構造器
* */
//獲取指定的屬性public權限
Field field=clazz.getField("age");
//設置當前屬性的值
field.set(man,22);
//獲取當前屬性的值
int id=(int)field.get(man);
System.out.println(id);
//方式二:規範性操作運行時類中的指定屬性
//獲取指定變量名的屬性private也可以
Field name = clazz.getDeclaredField("name");
//設置屬性可訪問
name.setAccessible(true);
name.set(man,"Jack");
System.out.println(name.get(man));
/*
* 操作運行時類中的指定方法
* */
//獲取指定的某個方法參數一方法名稱,參數二形參列表
Method show = clazz.getDeclaredMethod("showNation", String.class);
//可訪問的權限保證可訪問
show.setAccessible(true);
//參數一方法的調用者,參數二給形參賦值的實參
show.invoke(man,"China");
//獲取靜態的方法
Method desc = clazz.getDeclaredMethod("desc");
desc.setAccessible(true);
desc.invoke(Man.class);
/*
* 調用運行時類中指定的構造器
* */
//獲取指定的構造器指明構造器的參數列表
Constructor constructor = clazz.getDeclaredConstructor(String.class);
//保證可訪問
constructor.setAccessible(true);
//調用此構造器創建對象
Object juli = constructor.newInstance("Juli");
System.out.println(juli);
}
}