专注Java教育14年 全国咨询/投诉热线:400-8080-105
动力节点LOGO图
始于2009,口口相传的Java黄埔军校
首页 hot资讯 Java反射实例

Java反射实例

更新时间:2020-11-23 17:48:43 来源:动力节点 浏览911次

Java反射(Reflection)就是在运行 Java 程序时,可以加载、探知、使用编译期间完全未知的类。也就是说,Java 程序可以加载一个运行时才得知类名的类,获得类的完整构造方法,并实例化出对象,给对象属性设定值或者调用对象的方法。本文我们就来通过Java反射实例来理解Java中的反射机制。


一、利用反射获取类信息的方式、获取当前类的所有方法和获取当前类及其父类的所有方法

实体类

package org.dennisit.reflect.entity;

import java.io.Serializable;

 

public class User implements Serializable{

 

    private String test;

    

    public void execute(String name,int age){

        System.out.println("name=" + name + ",age=" + age);

    }

}

反射测试类

 

package org.dennisit.reflect.main;

import java.lang.reflect.Field;

 

public class ReflectEx {

 

    public static void main(String[] args)throws Exception {

        Class cls = Class.forName("org.dennisit.reflect.entity.User");

        Object obj = cls.newInstance();       //创建User的对象

        Field f = cls.getDeclaredField("test");    //获取test属性

        f.setAccessible(true);                    //打开私有属性test的访问权限

        f.set(obj, "zhangsan");                    //为test重新复制

        System.out.println(f.get(obj));            //获取obj的test属性值

        //根据方法名execute获取方法

        java.lang.reflect.Method m = cls.getMethod("execute", String.class, int.class);

        m.invoke(obj, "dennisit",23);            //调用execute方法

    }

}

运行效果

 

zhangsan

name=dennisit,age=23

 

 

二、编写一个反射动态实例化类的例子

 

package org.dennisit.reflect.main;

import java.lang.reflect.Field;

import java.lang.reflect.Method;

import java.util.Map;

import java.util.Set;

 

public class DynamicReflect {

 

    public static Object getInstance(String className,Map<String,Object> map)throws Exception{

        Class c = Class.forName(className);

        Object obj = c.newInstance();                //对象对象

        Set<String> keys = map.keySet();            //获取对应的所有属性

        Field[] fAll = c.getDeclaredFields();        //获取类中所有属性

        for(int i=0;i<fAll.length;i++){

            for(String key:keys){                    //循环匹配

                if(fAll[i].getName().equals(key)){    //如果用户传入的属性跟获取到的类中的属性名匹配

                    Field f = c.getDeclaredField(key);//获取该属性

                    //构建setXxx()方法名

                    String methodName = "set" + key.substring(0,1).toUpperCase()+key.substring(1);

                    Method method = c.getMethod(methodName, f.getType());//根据构建的用户名获取对应的方法

                    method.invoke(obj, map.get(key));//方法调用

                }else{

                    continue;

                }

            }

        }

        return obj;

    }

}


三、接下来我们测试我们编写的动态反射实例化例子

 

实体类

package org.dennisit.reflect.entity;

import java.io.Serializable;

public class User implements Serializable{

 

    private String name;

    private int age;

    private String email;

    

    public User() {  //必须有无参构造

    

    }

 

    //getter() and setter()    

    

}

主测试类

 

package org.dennisit.reflect.main;

import java.util.HashMap;

import java.util.Map;

import org.dennisit.reflect.entity.User;

 

public class ReflectEx {

 

    public static void main(String[] args)throws Exception {

        Class cls = Class.forName("org.dennisit.reflect.entity.User");

        String className = "org.dennisit.reflect.entity.User";

        Map<String,Object> map = new HashMap<String, Object>();

        map.put("name", "dennisit");

        map.put("age", 22);

        map.put("email", "dennisit@163.com");

         

        User user = (User)DynamicReflect.getInstance(className, map);

        System.out.println(user.getName() + "," + user.getAge() + "," + user.getEmail());

    }

}

程序运行结果

dennisit,22,dennisit@163.com


以上就是Java反射实例,借助这些Java反射实例,能够帮助我们刚好的理解Java反射机制。实际上,反射的工作原理就是借助Class.java、Constructor.java、Method.java、Field.java这四个类在程序运行时动态访问和修改任何类的行为和状态。想要了解更深层次的反射机制,快来观看本站的Java基础教程吧!


提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>