Java学习笔记之反射

1.反射的含义

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

2.反射的使用

(1).获取Class对象的三种方式

第一种:Class.forName(“全类名”) ;多用于配置文件,将类名定义在配置文件中,读取文件,加载类。
第二种:类名.class ;多由于参数传递。
第三种:对象.getClass(); 返回Class对象。

(2).Class对象的方法:

  • 获取成员变量
    Field[] getFields() 只获取public修饰的成员变量,返回一个Field[] 。
    Field getField(String name) 只获取public修饰的指定成员变量,返回一个Fiedl。
    Field[] getDeclaredFileds() 获取所有成员变量,返回一个Field[] 。
    Field getDeclaredFiled(String name) 获取指定的成员变量,返回一个Field 。
    //获取class对象
   Class clas1=person.class;
    //1.获取成员变量
        Field[] fields=clas1.getFields();//只获取所有public修饰的成员变量
        Field f2=clas1.getField("price");//只获取所有public修饰的成员变量
        //获取成员变量的price的值
        person p=new person();
        //修改变量的值
        f2.set(p,"这三大");
        Object value= f2.get(p);//获取price变量的值,返回值是对象
        Field[] fielDec=clas1.getDeclaredFields(); //Field[] getDeclaredFileds() 获取所有成员变量
        for (Field i:fielDec) {
            System.out.println(i);//输出person类的所有成员变量
        }
        Field fieDec=clas1.getDeclaredField("age");//获取指定的变量
        //不可以直接访问除public修饰符以外的修饰符修饰的变量,
        //解决方案:忽略访问权限修饰符的安全检查
        fieDec.setAccessible(true);//暴力反射
        Object value1= fieDec.get(p);
        System.out.println(value1);
  • 获取成员方法
    Method[] getMethods() //只获取public修饰的方法
    Method getMethods(String name,类…parameterTypes) //只获取public修饰的指定方法
    Method getDeclaredMethods(String name,类…parameterTypes)//获取指定的成员方法
    Method[] getDeclaredMethods() //获取所有的成员方法
   		Class clas1=person.class;//获取class对象
		Method[]  getMet=clas1.getMethods();//获取所有的成员方法
        for (Method me:getMet) {
           System.out.println(me.getName());//将所有的成员方法名字输出
        }
        //获取指定的方法 ,并传参。其中 eat为成员方法名,String.class 为要传的参数类型
        Method getmet1=clas1.getMethod("eat",String.class);
        //执行方法 invoke(object,参数 )  其中object为person类的对象
        person p=new person();
        getmet1.invoke(p,"饭饭");//将饭饭传入person类的eat方法并执行

        //获取私有的方法
        Method drink=clas1.getDeclaredMethod("drink", String.class);
        person p=new person();
        drink.setAccessible(true);//暴力反射
        drink.invoke(p,"水");
  • 获取构造方法
    Constructor[] getConstructors() //获取所有公有的构造方法
    Constructor getConstructors(类…parameterTypes) //获取public修饰的构造方法并传参
    Constructor getDeclaredConstructors(类…parameterTypes)//获取参数匹配的构造方法并传参
    Constructor[] getDeclaredConstructors() //获取所有的构造方法
	Class clas1=person.class;//获取class对象
 	Constructor cons1=clas1.getConstructor(String.class,int.class,String.class);//获取有参数的构造函数
   	System.out.println(cons1);
    Object person=cons1.newInstance("张三",12,"das"); //创建对象
    System.out.println(person);
    //使用空参构造方法创建对象
    Object person= clas1.newInstance();

反射案例

实现步骤:
1.将需要创建的对象的全类名和需要执行的方法定义在配置文件中
2.在程序中加载读取配置文件
3.使用反射技术加载类文件内存
4.创建对象
5.执行方法

1.先建立prope.properties配置文件
className=cn.com.Person  //类的全名
methodName=eat			//成员方法
2.创建一个person类
package cn.com;
public class Person {
    public void eat(){
        System.out.println("吃东西");
    }
}
3.在main方法使用反射机制
public static void main(String[] args) throws Exception {
        //可以创建任意类的对象,可以执行任意方法
        //
        Person p=new Person();
        //1.加载配置文件
        //1.1创建propertoes对象
        Properties po = new Properties();
        //1.2加载配置文件,转换为一个Map集合
        //1.2.1获取class目录下的配置文件
        ClassLoader classLoader = MainTest.class.getClassLoader();//获取类加载器
        InputStream input = classLoader.getResourceAsStream("prope.properties");//获取字节流
        //System.out.println(input);
        po.load(input);

        //2.获取配置文件定义的数据
        String className=po.getProperty("className");
        String methodName=po.getProperty("methodName");
        String fieldName=po.getProperty("fieldName");
        System.out.println(className+"  "+methodName +fieldName);

        //3.加载该类进内存
        Class cla= Class.forName(className);
        //4.创建对象
        Object obj=cla.newInstance();
        //5.获取方法对象
        Method method=cla.getMethod(methodName);
        method.invoke(obj);
        Field fie=cla.getDeclaredField(fieldName);
        fie.setAccessible(true);
        Object val=fie.get(p);
        System.out.println(val);

    }

你可能感兴趣的:(Java学习笔记之反射)