java 反射

反射的概述

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

要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.

反射就是把java类中的各种成分映射成一个个的Java对象
例如:一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象。

一个类中这些成员方法、构造方法、在加入类中都有一个类来描述)
如图是类的正常加载过程:反射的原理在与class对象。
熟悉一下加载的时候:Class对象的由来是将class文件读入内存,并为之创建一个Class对象。

在这里插入图片描述

Java reflect 反射 0 java对象的三个阶段

在这里插入图片描述

反射具体实现

package reflect;
import java.lang.reflect.Method;

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

        //refeltEntity().show("welcome");;//entity.show("welcome");

        refeltMethod();

    }

    /**

     * 通过反射获取java类中get方法对应的值

     * @throws Exception  

     * @Description:

     */

    public static void getValueEnter() throws Exception{

        //String from, String to, String position, int id

        IpBean entity = new IpBean("北京","上海","9.11116",101);
        Class clz = entity.getClass();

        Method[] methods = clz.getDeclaredMethods();

        String methodName = "";

        String methodVal = "";

        for(Method m:methods){

            methodName = m.getName();

            //System.out.println(methodName.indexOf("get"));

            if(methodName.indexOf("get")==0){

                Object obj = m.invoke(entity,null);

                methodVal = obj==null?"":obj.toString();

                System.out.println(methodName+":"+methodVal);

            }

        }

    }

    public static void refeltMethod() throws Exception{

        String IpCls = "reflect.IpBean";

        Class clz = Class.forName(IpCls);

        //获取类的完整路径

        System.out.println(clz.getName());

        IpBean entity =  (IpBean) clz.newInstance();

        entity.setFrom("beijing");

        entity.setTo("xianguang");

        /**

         * 第一个参数是函数的名称,第二个参数是...(表示有无限个参数)表示函数的参数

         */

        Method method = clz.getMethod("show", String.class);

        /**

         * 第一个参数是调用函数的对象,第二个参数是函数执行时的参数

         * entity.show("welcome");

         */

        method.invoke(entity, "welcome");

        /**

         * 同样可以调用静态方法

         */

        method = clz.getMethod("getMsg", String.class,String.class);

        method.invoke(clz, "张斌",22+"");

    }


    public static IpBean refeltEntity() throws Exception{

        String IpCls = "reflect.IpBean";

        Class clz = Class.forName(IpCls);

        //获取类的完整路径

        System.out.println(clz.getName());

        IpBean entity =  (IpBean) clz.newInstance();

        entity.setFrom("beijing");

        entity.setTo("xianguang");

        return entity;

    }

}

## 新建一个实体类

package reflect;

@data
public class IpBean {

    private String from; // IP段起始

    private String to; // IP结束

    private String position; // 地理名称

    private int id = 0;


    public void show(String msg) {

        System.out.println(from + "---" + to + "-->" + msg);

    }

    public static void getMsg(String name, String age) {
        System.out.println(name + "----->" + age);

    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值