反射的使用
代码示例:
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);
}
}