Java反射详解及应用示例

反射是Java中最重要的内容之一,了解反射原理对我们学习各种框架具有很大的帮助

反射的原理:

反射应用示例:

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import org.junit.Test;

public class ReflectCase {
    //使用反射操作类里面的无参数的构造方法
    @Test
    public void test1() throws Exception
    {
        /**
         * 共有三种获取Class类的方法,下面这种是最常用的,除此以外还可以用Class c= Student.class
         * 和Class clazz2 = new Person().getClass();
         */
        Class c=Class.forName("Student");
        Student s=(Student) c.newInstance();//要对一个类进行实例化,可以new,不使用new,就用这种方法
        s.setName("张三");
        System.out.println(s.getName());
    }
    //使用反射操作类里面的有参数的构造方法
    @Test
    public void test2() throws Exception
    {
        Class c=Class.forName("Student");
        Constructor constructor=c.getConstructor(String.class,String.class);
        Student s=(Student) constructor.newInstance("李四","123456");
        System.out.println(s.getName());
    }
    //使用反射操作属性
    @Test
    public void test3() throws Exception
    {
        Class c=Class.forName("Student");
        Student s=(Student) c.newInstance();
        Field f=c.getDeclaredField("name");
        f.setAccessible(true);//操作私有属性或者私有方法要设置权限
        f.set(s, "王五");
        System.out.println(f.get(s));//和s.getName()作用一样
    }
    //使用反射操作方法
    @Test
    public void test4() throws Exception
    {
        Class c=Class.forName("Student");
        Student s=(Student) c.newInstance();
        Method m=c.getDeclaredMethod("setName", String.class);
        m.invoke(s, "赵六");
        System.out.println(s.getName());
    }
    //使用反射操作无参数静态方法
    @Test
    public void test5() throws Exception
    {
        Class c=Class.forName("Student");
        Student s=(Student) c.newInstance();
        Method m=c.getDeclaredMethod("s1");
        m.invoke(null);//静态方法传null,普通方法对象
    }
    //使用反射操作有参数静态方法
    @Test
    public void test6() throws Exception
    {
        Class c=Class.forName("Student");
        Method m=c.getDeclaredMethod("add",int.class,int.class);
        System.out.println(m.invoke(null,12,34));
    }
}
class Student
{
    private String name;
    private String sid;
    public Student() {}
    public Student(String name, String sid) {
        this.name = name;
        this.sid = sid;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getSid() {
        return sid;
    }
    public void setSid(String sid) {
        this.sid = sid;
    }
    public static void  s1() {
        System.out.println(111);
    }
    public static int add(int a,int b) {
        return a+b;
    }
}

运行结果:

posted @ 2016-10-18 14:49  凌晨。。。三点  阅读(473)  评论(0编辑  收藏  举报