反射
一个java类有多个组成部分,例如:成员变量、构造函数、方法等。反射就是加载类,并解剖出类的各个组成部分
加载类
对于私有的XX,使用getDeclaredXX(….),并且需要加上xx.setAccessible(true);
反射类的构造函数
// 反射构造函数:public Person()
@Test
public void test1() throws Exception{
Class clazz = Class.forName("com.hcz.reflect.Person");
Constructor<Person> c = clazz.getConstructor(null);
Person p = c.newInstance(null);
System.out.println(p.getName());
}
// 反射构造函数:public Person(String name)
@Test
public void test2() throws Exception{
Class clazz = Class.forName("com.hcz.reflect.Person");
Constructor<Person> c = clazz.getConstructor(String.class);
Person p = c.newInstance("张三");
System.out.println(p.getName());
}
// 反射构造函数:private Person(String name,int height)
@Test
public void test3() throws Exception{
Class clazz = Class.forName("com.hcz.reflect.Person");
Constructor<Person> c = clazz.getDeclaredConstructor(String.class,int.class);
c.setAccessible(true);// 暴力反射
Person p = c.newInstance("李四",180);
System.out.println(p.getName()+p.getHeight());
}
// 反射构造函数:简单方式 无参
@Test
public void test4() throws Exception{
Class clazz = Class.forName("com.hcz.reflect.Person");
Person p = (Person) clazz.newInstance(); // 无参构造函数
System.out.println(p.getName()+p.getHeight());
}
反射方法
// 反射方法:public void eat(){
@Test
public void test5() throws Exception{
Class clazz = Class.forName("com.hcz.reflect.Person");
Person p = (Person) clazz.newInstance();
Method m = clazz.getMethod("eat");
m.invoke(p);
}
// 反射方法带参帯返回值:public String eat(String food){
@Test
public void test6() throws Exception{
Class clazz = Class.forName("com.hcz.reflect.Person");
Person p = (Person) clazz.newInstance();
Method m = clazz.getMethod("eat", String.class);
System.out.println((String) m.invoke(p, "apple"));
}
// 反射私有方法:private void pee(){
@Test
public void test7() throws Exception{
Class clazz = Class.forName("com.hcz.reflect.Person");
Person p = (Person) clazz.newInstance();
Method m = clazz.getDeclaredMethod("pee");
m.setAccessible(true);
m.invoke(p);
}
// 反射静态方法:public static void sleep(){
@Test
public void test8() throws Exception{
Class clazz = Class.forName("com.hcz.reflect.Person");
Method m = clazz.getDeclaredMethod("sleep");
m.invoke(null);// 静态方法不需要对象,当然传了对象也是可以的
}
// 反射调用main方法
@Test
public void test9() throws Exception{
Class clazz = Class.forName("com.hcz.reflect.Person");
Method m = clazz.getMethod("main",String[].class);
m.invoke(null, (Object)new String[]{"1"});
}
反射字段
// 反射字段
@Test
public void test10() throws Exception{
Class clazz = Class.forName("com.hcz.reflect.Person");
Person p = (Person) clazz.newInstance();
Field f = clazz.getDeclaredField("name");
f.setAccessible(true);
Class type = f.getType();// 获取字段的类型
if(type.equals(String.class)){
String name = (String) f.get(p);
System.out.println(f.get(p));
}
}