一、概述
一个类有多个组成部分,例如:成员变量、成员方法、构造方法等。
反射就是加载类,并解剖出类的各个组成部分。
二、加载类
java中有一个Class类代表某一个类的字节码
方式一
Class clazz = Class.forName("cn.wzk.reflect.Person");
方式二
Class clazz = Person.Class;
方式三
Class clazz = new Person().getClass();
三、解剖类
1.反射类的字段
class Person{
public String name;
private int age;
public void show(){
System.out.println(this.name);
System.out.println(this.age);
}
//构造方法
public Person(){
System.out.println("无参构造方法。。。");
}
public Person(String name){
System.out.println("name :一个参数的构造函数。。。");
}
public Person(String name,int age){
System.out.println("name,age : 两个参数的构造函数。。。。");
}
private Person(List list){
System.out.println("List : 私有构造函数。。。。。");
}
//成员方法
public void method1(){
System.out.println("method1........");
}
public void method1(String name,int age){
System.out.println(name+"------"+age);
}
public String method1(String name,int[] age){
return name;
}
public static void method1(int num){
System.out.println(num);
}
private void method1(InputStream is){
System.out.println(is);
}
}
Person p = new Person();
Class clazz= Class.forName("cn.wzk.reflect.Person");
Field name= clazz.getField("name");
name.set(p, "哈哈");
Field age = clazz.getDeclaredField("age");
age.setAccessible(true);
age.set(p,20);
p.show();
2.反射类的构造方法
/**
* 反射构造函数:public Person()
*/
@Test
public void test2() throws Exception{
Class clazz = Class.forName("cn.wzk.reflect.Person");
Constructor c = clazz.getConstructor();
Person p = (Person)c.newInstance();
System.out.println(p.name);
}
/**
* 反射构造函数:public Person(String name)
* @throws Exception
*/
@Test
public void test3() throws Exception{
Class clazz = Class.forName("cn.wzk.reflect.Person");
Constructor c = clazz.getConstructor(String.class);
Person p = (Person)c.newInstance("小红");
}
/**
* 反射构造函数:public Person(String name,int age)
* @throws Exception
*/
@Test
public void test4() throws Exception{
Class clazz = Class.forName("cn.wzk.reflect.Person");
Constructor c = clazz.getConstructor(String.class,int.class);
Person p =(Person)c.newInstance("Mike",20);
}
/**
* 反射构造函数:private Person(List list)
* @throws Exception
*/
@Test
public void test5() throws Exception{
Class clazz = Class.forName("cn.wzk.reflect.Person");
Constructor c = clazz.getDeclaredConstructor(List.class);
c.setAccessible(true);
Person p = (Person)c.newInstance(new ArrayList());
}
3.反射类的成员方法
/**
* 反射成员方法:public void method1()
* @throws Exception
*/
@Test
public void test6() throws Exception{
Class clazz = Class.forName("cn.wzk.reflect.Person");
Person p = (Person)clazz.newInstance();
Method method = clazz.getMethod("method1");
method.invoke(p);
}
/**
* 反射成员方法:public void method1(String name,int age)
* @throws Exception
*/
@Test
public void test7() throws Exception{
Class clazz = Class.forName("cn.wzk.reflect.Person");
Person p = (Person)clazz.newInstance();
Method method = clazz.getMethod("method1",String.class,int.class);
method.invoke(p,"mike",20);
}
/**
* 反射成员方法:public String method1(String name,int[] age)
* @throws Exception
*/
@Test
public void test8() throws Exception{
Class clazz = Class.forName("cn.wzk.reflect.Person");
Person p = (Person)clazz.newInstance();
Method method = clazz.getMethod("method1",String.class,int[].class);
Object name =method.invoke(p,"jack",new int[]{1,2,3});
System.out.println(name);
}
/**
* 反射成员方法:public static void method1(int num)
* @throws Exception
*/
@Test
public void test9() throws Exception{
Class clazz = Class.forName("cn.wzk.reflect.Person");
Person p = (Person)clazz.newInstance();
Method method = clazz.getMethod("method1",int.class);
method.invoke(p,5);
}
/**
* 反射成员方法:private void method1(InputStream is)
* @throws Exception
*/
@Test
public void test10() throws Exception{
Class clazz = Class.forName("cn.wzk.reflect.Person");
Person p = (Person)clazz.newInstance();
Method method = clazz.getDeclaredMethod("method1",InputStream.class);
method.setAccessible(true);
method.invoke(p,new FileOutputStream("a.txt"));
}
4.反射类的main方法
public static void main(String[] args) {
System.out.println("mian方法。。。。。");
}
/**
* 反射类的main方法
*/
@Test
public void test11() throws Exception{
Class clazz = Class.forName("cn.wzk.reflect.Person");
Method method = clazz.getDeclaredMethod("main",String[].class);
method.invoke(null, (Object)new String[]{"aa","bb"});
}
注意
对于反射的参数是数组的情况下,会将数组进行拆开(其实是为了兼容jdk1.4)jdk1.4没有可变数组。解决
方式一:
method.invoke(null, (Object)new String[]{"aa","bb"});
方式二:
method.invoke(null,new Object[]{new String[]{"aa","bb"}});