反射
1. 获取类加载器的方法
public class ClassTest {
public static void main ( String[] args ) throws ClassNotFoundException {
Class<Person> clazz01 = Person.class;
Person person = new Person();
Class clazz02 = person.getClass();
Class clazz03 = Class.forName("com.wcc.reflect.Person");
ClassLoader classLoader = ClassTest.class.getClassLoader();
Class clazz04 = classLoader.loadClass("com.wcc.reflect.Person");
System.out.println(clazz01);
System.out.println(clazz02);
System.out.println(clazz03);
System.out.println(clazz04 );
}
}
2. 反射中的常用方法
1.定义一个类
public class Person {
private String name;
public int age;
public Person(){
}
private Person(int age){
this.age =age;
}
private Person(String name){
this.name = name;
}
public Person(String name,int age){
this.name = name;
this.age = age;
}
@Override
public String toString () {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public void show(){
System.out.println("我是公开的show方法");
}
private void test(String name){
System.out.println("我是私有的test方法"+name);
}
}
2. 进行反射方法的测试
public class PersonTest001 {
@Test
public void test01(){
Person p = new Person("tom",10);
System.out.println(p);
p.show();
}
@Test
public void test002() throws Exception {
Class<Person> clazz = Person.class;
Constructor<Person> constructor = clazz.getConstructor(String.class, int.class);
Person p = constructor.newInstance("tom", 12);
System.out.println(p);
Field age = clazz.getField("age");
age.set(p,10);
System.out.println(p);
Method method = clazz.getDeclaredMethod("show");
method.invoke(p);
}
@Test
public void test003() throws Exception {
Class<Person> clazz = Person.class;
Constructor<Person> con = clazz.getDeclaredConstructor(String.class);
con.setAccessible(true);
Person per = con.newInstance("jerry");
System.out.println(per);
Field name = clazz.getDeclaredField("name");
name.setAccessible(true);
name.set(per,"wangzi");
System.out.println(per);
Method method = clazz.getDeclaredMethod("test", String.class);
method.setAccessible(true);
method.invoke(per,"chaochao");
}
@Test
public void test004() throws Exception {
Class<Person> clazz = Person.class;
Person person = clazz.newInstance();
Constructor<?>[] con = clazz.getDeclaredConstructors();
for (Constructor<?> c :con){
System.out.println(c);
}
Field[] fields = clazz.getDeclaredFields();
for (Field f:fields){
System.out.println(f);
}
Method[] methods = clazz.getDeclaredMethods();
for (Method m :methods){
System.out.println(m);
}
}
}