一、反射是什么
Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于 Reflection API 取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。
二、创建对象的三种方式
(1)Class clazz = 类名.class
(2)Class clazz = 对象.getClass()
(3)Class clazz = Class.forName(“类的全类名”) 最常用
(4)ClassLoader cl = this.getclass().getClassLoader()
Class clazz = cl.loadClass(“类的全类名”)了解
三、加载外部资源的两种方式
(1)直接使用new
路径是在当前工程或Module下
@Test
public void test1() throws Exception{
Properties prop = new Properties();
FileInputStream file = new FileInputStream("jdbc.properties");
prop.load(file);
String username = prop.getProperty("username");
String password = prop.getProperty("password");
System.out.println("username = "+ username + ", password = "+ password);
}
(2)类的加载器
路径是在src目录下
@Test
public void test1() throws Exception{
Properties prop = new Properties();
ClassLoader classLoader = ClassLoderTest.class.getClassLoader();
InputStream is = classLoader.getResourceAsStream("jdbc1.properties");
prop.load(is);
String username = prop.getProperty("username");
String password = prop.getProperty("password");
System.out.println("username = "+ username + ", password = "+ password);
}
使用方法
创建运行时类对象及调用成员变量
newInstance()
getDeclaredField(变量名)
setAccessible(true)
Field对象.set(对象、值)
Field对象.get(对象)
@Test
public void FieldTest() throws Exception{
Class clazz = Person.class;
Person p = (Person) clazz.newInstance();
Field name = clazz.getDeclaredField("name");
name.setAccessible(true);
name.set(p, "Tom");
System.out.println(name.get(p));
}
调用方法
getDeclaredMethod(方法名、形参类型)
setAccessible(true)
returnVal = 方法名.invoke(对象, 实参)
returnVal =方法名.invoke(null,实参) 静态方法
@Test
public void testMethod() throws Exception{
Class clazz = Person.class;
Person p = (Person) clazz.newInstance();
Method show = clazz.getDeclaredMethod("show", String.class);
show.setAccessible(true);
Object obj = show.invoke(p, "CHN");
System.out.println(obj);
System.out.println("*****************************");
Method showDesc = clazz.getDeclaredMethod("showDesc");
showDesc.setAccessible(true);
Object returnVal = showDesc.invoke(null);
System.out.println(returnVal);
}
构造器
getDeclaredConstructor(形参类型)
setAccessible(true)
newInstance(实参)
@Test
public void testConstructor() throws Exception{
Class clazz = Person.class;
Constructor declaredConstructor = clazz.getDeclaredConstructor(String.class);
declaredConstructor.setAccessible(true);
Person person = (Person) declaredConstructor.newInstance("Tom");
System.out.println(person);
}
获取运行时类的带泛型的父类的泛型
getGenericSuperclass()
ParameterizedType强制转换
getActualTypeArguments()
getTypeName()
@Test
public void test4(){
Class clazz = Person.class;
Type genericSuperclass = clazz.getGenericSuperclass();
ParameterizedType paramType = (ParameterizedType) genericSuperclass;
Type[] actualTypeArguments = paramType.getActualTypeArguments();
for (Type a:actualTypeArguments){
System.out.println(a.getTypeName());
}
}
总结
fine