0
点赞
收藏
分享

微信扫一扫

JDK提供的三种反射,通过反射构造类对象并调用其方法的实现与剖析

上一篇博客[java中反射与代理的关系,动态代理InvocationHandler和Proxy的实现与剖析]主要讲解代理模式,对于反射的使用只是简单说一下,本文主要对反射进行补充完善。

jdk中提供了三种方式来获取类Class,我们来逐一讲解和使用下:

目录

1,通过类的名称,全限定名获取类Class信息

1.1 实例化对象并调用方法的方式 

1.2 反射并构建实例化对象的过程分析

2,通过类名获取类Class信息

3,通过实例化类对象获取类Class信息

总结:


1,通过类的名称,全限定名获取类Class信息

简单实现如下:

//MainTestClassService.java
package com.lzm.service;

public interface MainTestClassService {
    public void MainHelloTest();
}

//MainTestClassServiceImpl.java
package com.lzm.controller;
import com.lzm.service.MainTestClassService;

public class MainTestClassServiceImpl implements MainTestClassService{

    @Override
    public void MainHelloTest() {
        System.out.println("你好,我是小明");
    }
}

//ReflectionApplication.java
package com.lzm.reflection;

import com.lzm.controller.MainTestClassServiceImpl;
import com.lzm.service.MainTestClassService;

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

public class ReflectionApplication {

    public static void main(String[] args) {
        try {
            Class<?> clazz = Class.forName("com.lzm.controller.MainTestClassServiceImpl");
            System.out.println("通过反射,实例化对象,获取方法");
            Object obj = clazz.newInstance();
            MainTestClassService mtcs = (MainTestClassService)obj;
            mtcs.MainHelloTest();
            System.out.println("通过Method获取方法");
            Method method = obj.getClass().getDeclaredMethod("MainHelloTest");
            method.invoke(obj,null);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}

运行结果: 

1.1 实例化对象并调用方法的方式 

1.2 反射并构建实例化对象的过程分析

既然要了解反射,那么获取相应的class对象信息根据构造方法并将其转化为实例化对象,根据实例化后的对象调用方法,有两种实现方式。

2,通过类名获取类Class信息

简单实现如下,接口和实现类延用上述内容:

//ReflectionApplication.java
package com.lzm.reflection;

import com.lzm.controller.MainTestClassServiceImpl;
import com.lzm.service.MainTestClassService;
import sun.misc.Unsafe;
import sun.reflect.CallerSensitive;
import sun.reflect.Reflection;

import java.lang.reflect.*;

public class ReflectionApplication {

    public static void main(String[] args) {

        try {
            Class<?> clazz = MainTestClassServiceImpl.class;
            Object obj = clazz.newInstance();
            Method method = clazz.getDeclaredMethod("MainHelloTest");
//          Method method = obj.getClass().getDeclaredMethod("MainHelloTest");
            method.invoke(obj,null);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}

运行结果: 

3,通过实例化类对象获取类Class信息

简单实现如下,接口和实现类延用上述内容:

//ReflectionApplication.java
package com.lzm.reflection;

import com.lzm.controller.MainTestClassServiceImpl;
import com.lzm.service.MainTestClassService;
import sun.misc.Unsafe;
import sun.reflect.CallerSensitive;
import sun.reflect.Reflection;

import java.lang.reflect.*;

public class ReflectionApplication {

    public static void main(String[] args) {

        try {
            MainTestClassService mtcs = new MainTestClassServiceImpl();
            Class<?> clazz = mtcs.getClass();
            Method method = clazz.getDeclaredMethod("MainHelloTest");
            Object obj = clazz.newInstance();
            method.invoke(obj , null);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}

运行结果:

总结:

本文从JDK提供的三种反射方式,对通过反射实例化对象并调用其方法进行了实现和剖析,但是,我还是没有自己写底层的反射,我决定再拖一拖!

举报

相关推荐

0 条评论