Java_通过反射调用类中的方法

先上一个基本的封装:

 /**
     * 获取classType
     *
     * @param type
     * @param provinceCode
     * @param cityCode
     * @return
     * @throws Exception
     */
    public Class<?> getClassType(String type, String provinceCode, String cityCode, String suffix) throws Exception {
        Class<?> classType = Class.forName("com.lkb.sb." + type + "." + provinceCode + "." + cityCode + suffix);
        return classType;
    }

    /**
     * 获取base
     *
     * @param className
     * @return
     * @throws Exception
     */
    public Class<?> getClassType(String className) throws Exception {
        Class<?> classType = Class.forName(className);
        return classType;
    }

    /**
     * @param classType
     * @return
     * @throws Exception
     */
    public Object getClassInstance(Class<?> classType) throws Exception {
        return getClassInstance(classType, null, null);
    }

    /**
     * 获取对象client
     *
     * @param classType
     * @param classes
     * @param objects
     * @return
     * @throws Exception
     */
    public Object getClassInstance(Class<?> classType, Class[] classes, Object[] objects) throws Exception {
        Object client = classType.getConstructor(classes).newInstance(objects);
        return client;
    }

    /**
     * 执行不带参数的方法
     *
     * @param classType
     * @param instance
     * @param method
     * @return
     * @throws Exception
     */
    public Object implementMethod(Class<?> classType, Object instance, String method) throws Exception {
        return implementMethod(classType, instance, method, null, null);
    }

    /**
     * 执行方法
     *
     * @param classType
     * @param instance
     * @param method
     * @param paramTypes
     * @param params
     * @return
     * @throws Exception
     */
    public Object implementMethod(Class<?> classType, Object instance, String method, Class[] paramTypes, Object[] params) throws Exception {
        Method getStrMethod;
        Object result;
        if (paramTypes == null) {
            getStrMethod = classType.getMethod(method);
            result = getStrMethod.invoke(instance);
        } else {
            getStrMethod = classType.getMethod(method, paramTypes);
            result = getStrMethod.invoke(instance, params);
        }
        return result;
    }

进一步封装,通过实现接口的形式调用,这样就省略了每次反射方法时还要写上参数类型数组:

package com.lkb.autoCode.util;

import com.lkb.autoCode.constant.AutoCodeConstant;

import java.lang.reflect.Method;

/**
 * DefultClassLoader 默认的类加载器
 *
 * @author Lilin
 * @date 2016/5/24
 */
public class DefultClassLoader<T> {

    private Class<?> classType = null;
    private T reflectClass = null;

    /**
     * @param fullClassName 全包路径
     * @throws Exception
     */
    public DefultClassLoader(String fullClassName) throws Exception {
        classType = getClassType(fullClassName);
    }

    /**
     * @param type         模板类型
     * @param provinceCode 省Id
     * @param cityCode     市Id
     * @param className    类名称
     * @throws Exception
     */
    public DefultClassLoader(String type, String provinceCode, String cityCode, String className) throws Exception {
        classType = getClassType(type, provinceCode, cityCode, className);
    }

    /**
     * 获取classType
     *
     * @param type
     * @param provinceCode
     * @param cityCode
     * @return
     * @throws Exception
     */
    public Class<?> getClassType(String type, String provinceCode, String cityCode, String suffix) throws Exception {
        Class<?> classType = Class.forName(AutoCodeConstant.BASE_SB_PACKAGE + "." + type + "." + provinceCode + "." + cityCode + suffix);
        return classType;
    }

    /**
     * 获取base
     *
     * @param fullClassName
     * @return
     * @throws Exception
     */
    public Class<?> getClassType(String fullClassName) throws Exception {
        Class<?> classType = Class.forName(fullClassName);
        return classType;
    }

    /**
     * 获取对象client
     * @return
     * @throws Exception
     */
    public T getClassInstance() throws Exception {
        return getClassInstance(null, null);
    }

    /**
     * 获取对象client
     *
     * @param classes
     * @param objects
     * @return
     * @throws Exception
     */
    public T getClassInstance(Class[] classes, Object[] objects) throws Exception {
        T client = (T) classType.getConstructor(classes).newInstance(objects);
        return client;
    }

    /**
     * 执行不带参数的方法(忽略)
     *
     * @param classType
     * @param instance
     * @param method
     * @return
     * @throws Exception
     */
    public Object implementMethod(Class<?> classType, Object instance, String method) throws Exception {
        return implementMethod(classType, instance, method, null, null);
    }

    /**
     * 执行方法(忽略)
     *
     * @param classType
     * @param instance
     * @param method
     * @param paramTypes
     * @param params
     * @return
     * @throws Exception
     */
    public Object implementMethod(Class<?> classType, Object instance, String method, Class[] paramTypes, Object[] params) throws Exception {
        Method getStrMethod;
        Object result;
        if (paramTypes == null) {
            getStrMethod = classType.getMethod(method);
            result = getStrMethod.invoke(instance);
        } else {
            getStrMethod = classType.getMethod(method, paramTypes);
            result = getStrMethod.invoke(instance, params);
        }
        return result;
    }
}

路漫漫其修远兮!!!

缺点:构造器的创建还得传递参数类型数组

时间: 2024-10-16 13:11:55

Java_通过反射调用类中的方法的相关文章

通过反射调用类中的方法

操作步骤: 1:实例化Class: 2:通过Class类的getMethod()方法取得一个Method的对象,并设置次方法操作时所需的参数类型: 3:使用invoke进行调用,并向方法中传递要设置的参数,但在使用invoke()方法时必须传入一个类的实例化对象 实例1:sayChina()方法中没有参数 package cn.itcast02; import java.lang.reflect.Method; //调用Person类中的sayChina()方法,没有参数 public clas

使用Java的反射功能调用类中的方法

最近一直在搞Java的反射,今天使用反射调用方法时出现了很多问题,主要是没有详细参考官方API.所以走了很多弯路. 所以想把这个例子记下来,供自己也供他人学习. package com.mine.practice.reflect; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /** * 使用反射调用类中的方法 * @author 2014-11-5 上午10:51:28

通过反射 调用 类里面的 方法的方法

通过反射 调用 类里面的 方法的方法(注意 重载 ,可以 按F12转到 定义 查看 ): 错误方法: MethodInfo dynMethod = this.GetType().GetMethod("Draw_" + itemType); dynMethod.Invoke(this, new object[] { methodParams }); 正确 方法 : MethodInfo dynMethod = this.GetType().GetMethod("Draw_&qu

C#如何通过反射调用类下的方法

首先模拟一个mvc的项目,创建一个业务类(HomeService),在类下创建3个方法 public class HomeService { /// <summary> /// 无参方法 /// </summary> /// <returns></returns> public string SayHello() { string str = "你好!"; return str; } /// <summary> /// 有参方

C#通过反射获取类中的方法和参数个数,反射调用方法带参数

using System; using System.Reflection; namespace ConsoleApp2 { class Program { static void Main(string[] args) { //反射获取 命名空间+类名 string className = "ConsoleApp2.ClassSample"; string methodName = "test1"; //传递参数 Object[] paras = new Obje

C#反射调用类的私有方法

void Main() { var type = typeof(StockClass); type.Dump(); var fields=type.GetFields(BindingFlags.Instance|BindingFlags.NonPublic).Dump("字段"); var members = type.GetMethods().Dump("方法"); //调用私有的构造函数,获得实例化对象 object obj=type.GetConstructo

Java反射调用多种类型的方法总结

最近一直在搞Java中的反射,遇到了小问题,所以总结下反射时调用方法需要注意的事项以及各种例子. 本例主要实现的功能有 * 1.没有参数的方法 * 2.一个参数的方法,没有返回值的方法 * 3.多个参数的方法 * 4.参数为数组的方法 * 5.参数为集合的方法 * 6.返回值为数组的方法 下面直接来例子 package com.mine.practice.reflectMethod; import java.lang.reflect.InvocationTargetException; impo

Java反射机制demo(五)—获得并调用一个类中的方法

这个demo在使用反射机制操作属性之前,主要原因是因为在.class文件字节码中,方法排在属性的前面. 1,获得一个类中的方法 先看一下方法和运行结果.获取所有的方法使用Class类中getMethos()方法. 待获取的类: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 package

java 27 - 6 反射之 通过配置文件运行类中的方法

在以前,如果我们想要调用一个类中的方法,只能这样子: 例: 有Cat和Dog两个类,里面有eat和run两个成员方法: 1 public class Dog { 2 3 public void eat() { 4 System.out.println("狗吃肉"); 5 } 6 7 public void run() { 8 System.out.println("狗刨"); 9 } 10 } public class Cat { public void eat()