Java反射机制

2018-1-10 / 0 评论 / 6768 阅读

反射的核心就是加载类解剖出类的各个组成部分 例如:成员变量 、方法 、构造方法!

加载类的三种方法

/提取当前类的 Class 对象。 


方法1
Class claszz1=Class.forName("com.rain.demo.Person");
方法2
Class claszz2=Person.class;
方法3
Class claszz3=new Hero().getClass();


解剖类的常用方法

//返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法。
public Constructor<T> getConstructor(Class<?>... parameterTypes)
返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法
public Method getMethod(String name, Class<?>... parameterTypes)
//返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。
public Field getField(String name)

//私有
public Field getDeclaredField(String name)
//私有
public Method getDeclaredMethod(String name, Class<?>... parameterTypes)
//返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定私有构造方法。
public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)


反射功能实际作用是用来开发框架如:spring

实例

Person.java

package com.rain.demo;

public class Person {
        public String name="123";
        public Person(){
            System.out.println("person");
        }
        public Person(String name){
            System.out.println("person name");
        }
        public Person(String name,int password){
            System.out.println("person name password");
        }
        public void getString(){
               System.out.println(name);
        }
}



Demo1.java

package com.rain.demo;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import org.junit.Test;

public class Demo1 {
    //反射新建类的对象
    @Test
    public void test1() throws NoSuchMethodException, SecurityException, ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
        Class claszzClass = Class.forName("com.rain.demo.Person");
        Constructor c = claszzClass.getConstructor(null);
        Person p = (Person)c.newInstance(null);
        System.out.println(p.name);
    }
    @Test
    public void test2() throws ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException{
        //提取当前类的 Class 对象。 
        Class claszzClass1=Class.forName("com.rain.demo.Person");

        //返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法。
        Constructor c =claszzClass1.getConstructor(String.class);

        //使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例,
        Person p = (Person)c.newInstance("xxxx");

        System.out.println("test2");
        System.out.println(p.name);

    }

    @Test
    public void test3() throws ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException{
        Person p = new Person();
        Class claszzClass3=Class.forName("com.rain.demo.Person");
        //
        Method method = claszzClass3.getMethod("getString", null);  //方法名 参数
        method.invoke(p, null);
    }

}







    评论一下?

    OωO
    取消