在JAVA中,怎么利用反射获取一个方法

在JAVA中,怎么利用反射获取一个方法,第1张

java的反射用法:(异常请自行处理)

①找到类:Class cl = ClassforName("javautilDate");

②创建对象(要求这个类中含有空参数的构造方法):Object obj = clnewInstence();

③根据名称和参数找方法:Method method1 = clgetMethod("getTime");//如果没有参数不用写第二个参数如果有参数的如:Method method2 = clgetMethod("setTime",longclass);

④在某个对象上面执行方法,Object result = method1invoke(obj);//如果有参数的Object result = method2invoke(obj,21317362721);

执行的方如果有返回值,将返回值返回,否则返回null

java开发工程师岗位职责:

1、负责公司网站开发和维护;

2、负责对网站进行实施,测试;

3、负责现有网站的维护和升级;

4、负责解决开发过程中的技术问题;

5、负责网站开发文档编写工作;

6、统一代码风格、监督团队开发、落实测试、验收代码质量;

7、参与软件系统设计,能编写代码。

这是我自己写的一个类,用java反射写的。有多个功能。如数据拷贝等。具体请看代码注释(超过10000字不让发。)你可以参考一下完整代码可以到我空间查看 public class BaseClass {

/

@描述: 执行指定对象的指定方法(该方法更适合于执行无参的构造方法和有参的方法)

@param obj 需要执行的对象的实例(如果对象的实例不存在即指定 obj == null,则系统会新创建一个实例);

@param className 需要执行的对象的实例(如果对象的实例不存在即指定 obj == null,则系统会新创建一个实例);

@param className 对象的名称(需要添加包名如 combintesttestBean其中combintest为包名testBean为方法名)

@param methodName 需要执行对象中的方法名称(可通过displayAllMethod(T t))来查看该对象有哪些方法 如:Test对象中有方法

setAge(int age);则methodName应写为[setAge]

@param methodParmeterNames 需要执行的方法的参数名 基本类型可直接用int,char等来表示,但是如果是其他类型如List则必需写成javautilList具体参数类型可通过displayAllMethod(T t)

方法来查看该对象的所有方法及需要的参数类型) 同时请注意:methodParmeterNames必须和methodParmeterValues配对出现且数量必须一样;如methodParmeterNames

为null则参数methodParmeterValues也必须为null(即无参方法),如methodParmeterNames长度为1,则methodParmeterValues的长度也必须为1

@param methodParmeterValues 需要执行的方法的参数值 请注意:methodParmeterNames必须和methodParmeterValues配对出现且数量必须一样;如methodParmeterNames

为null则参数methodParmeterValues也必须为null(即无参方法),如methodParmeterNames长度为1,则methodParmeterValues的长度也必须为1

@return

/

public Object executeMethod(Object obj,String className,String methodName,String[]methodParmeterNames,Object[] methodParmeterValues){

return executeMethod(obj, className, null, null, methodName, methodParmeterNames, methodParmeterValues);

}

/

@描述: 执行指定对象的指定方法(该方法更适合于执行无参的构造方法和无参的方法)

@param obj 需要执行的对象的实例(如果对象的实例不存在即指定 obj == null,则系统会新创建一个实例);

@param className 对象的名称(需要添加包名如 combintesttestBean其中combintest为包名testBean为方法名)

@param methodName 需要执行对象中的方法名称(可通过displayAllMethod(T t))来查看该对象有哪些方法 如:Test对象中有方法

setAge(int age);则methodName应写为[setAge]

@return

/

public Object executeMethod(Object obj,String className,String methodName){

return executeMethod(obj, className, null, null, methodName, null, null);

}

/

@描述: 执行指定对象的指定方法

@param obj 需要执行的对象的实例(如果对象的实例不存在即指定 obj == null,则系统会新创建一个实例);

@param className 对象的名称(需要添加包名如 combintesttestBean其中combintest为包名testBean为方法名)

@param ConstructorParameterNames 构造方法的参数名 基本类型可直接用int,char等来表示,但是如果是其他类型如List则必需写成javautilList具体参数类型可通过displayAllConstructor(T t)

方法来查看该对象的所有构造方法及需要的参数类型) 同时请注意:ConstructorParameterNames必须和ConstructorParameterValues配对出现且数量必须一样;如ConstructorParameterNames

为null则参数ConstructorParameterValues也必须为null(即无参构造方法),如ConstructorParameterNames长度为1,则ConstructorParameterValues的长度也必须为1

@param ConstructorParameterValues 构造方法的参数值 请注意:ConstructorParameterNames必须和ConstructorParameterValues配对出现且数量必须一样;如ConstructorParameterNames

为null则参数ConstructorParameterValues也必须为null(即无参构造方法),如ConstructorParameterNames长度为1,则ConstructorParameterValues的长度也必须为1

@param methodName 需要执行对象中的方法名称(可通过displayAllMethod(T t))来查看该对象有哪些方法 如:Test对象中有方法

setAge(int age);则methodName应写为[setAge]

@param methodParmeterNames 需要执行的方法的参数名 基本类型可直接用int,char等来表示,但是如果是其他类型如List则必需写成javautilList具体参数类型可通过displayAllMethod(T t)

方法来查看该对象的所有方法及需要的参数类型) 同时请注意:methodParmeterNames必须和methodParmeterValues配对出现且数量必须一样;如methodParmeterNames

为null则参数methodParmeterValues也必须为null(即无参方法),如methodParmeterNames长度为1,则methodParmeterValues的长度也必须为1

@param methodParmeterValues 需要执行的方法的参数值 请注意:methodParmeterNames必须和methodParmeterValues配对出现且数量必须一样;如methodParmeterNames

为null则参数methodParmeterValues也必须为null(即无参方法),如methodParmeterNames长度为1,则methodParmeterValues的长度也必须为1

@return

/

public Object executeMethod(Object obj,String className,String[]ConstructorParameterNames,Object[] ConstructorParameterValues,String methodName,String[]methodParmeterNames,Object[] methodParmeterValues) {

try {

//如果用户未指定一个对象的实例则方法会自动为用户创建一个对象的实例

if(obj==null)obj = getInstance(className, ConstructorParameterNames, ConstructorParameterValues);//创建一个实例

//将用户传递进入的参数转换为相应的class参数类型

Class[] methodParName = getMethodClass(methodParmeterNames);

//从指定对象实例中获取指定方法

Method method = objgetClass()getMethod(methodName, methodParName);

//执行该实例的某个方法

return methodinvoke(obj, methodParmeterValues);

} catch (SecurityException e) {

eprintStackTrace();

return null;

} catch (NoSuchMethodException e) {

eprintStackTrace();

return null;

} catch (IllegalArgumentException e) {

eprintStackTrace();

return null;

} catch (IllegalAccessException e) {

eprintStackTrace();

return null;

} catch (InvocationTargetException e) {

eprintStackTrace();

return null;

}

}

/

@描述: 创建对象的一个新实例

@param className 对象的名称(需要添加包名如 combintesttestBean其中combintest为包名testBean为方法名)

@return Object对象的新实例(创建失败返回null)

/

public Object getInstance(String className){

return getInstance(className, null, null);

}

/

@描述: 创建对象的一个新实例

@param className 对象的名称(需要添加包名如 combintesttestBean其中combintest为包名testBean为方法名)

@param parameterNames 构造方法的参数名 parameterNames必须和parameterValues配对出现且数量必须一样;如parameterNames

为null则参数parameterValues也必须为null(即无参构造方法),如parameterNames长度为1,则parameterValues的长度也必须为1

@param parameterValues 构造方法的参数值 parameterValues必须和parameterNames配对出现且数量必须一样;如parameterValues

为null则参数parameterNames也必须为null(即无参构造方法),如parameterValues长度为1,则parameterNames的长度也必须为1

@return Object对象的新实例(创建失败返回null)

/

public Object getInstance(String className,String[]parameterNames,Object[] parameterValues){

//加载class

try {

Class cls = ClassforName(className);

//将用户传递进入的参数转换为相应的class参数类型

Class[] classPar = getMethodClass(parameterNames);//获取构造方法对应的参数类型

//获取指定对象的构造方法

Constructor cst = clsgetConstructor(classPar);

Object obj = null;

//根据参数类型创建一个对象的实例

if(classPar==null||classParlength==0){

obj = cstnewInstance(null);

}else{

obj = cstnewInstance(parameterValues);

}

return obj;

} catch (ClassNotFoundException e) {

eprintStackTrace();

return null;

} catch (SecurityException e) {

eprintStackTrace();

return null;

} catch (NoSuchMethodException e) {

eprintStackTrace();

return null;

} catch (IllegalArgumentException e) {

eprintStackTrace();

return null;

} catch (InstantiationException e) {

eprintStackTrace();

return null;

} catch (IllegalAccessException e) {

eprintStackTrace();

return null;

} catch (InvocationTargetException e) {

eprintStackTrace();

return null;

}

}

/

@描述:将一个bean中的字段内容 复制到另一个bean上(注意:前提条件为名称相同并且类型相同)

@param <T>

@param <S>

@param t 目标对象(注意:目标对象中必须与源对象中存在名称相同,且类型相同的字段)

@param s 数据源对象(注意:源对象中必须与目标对象中存在名称相同,且类型相同的字段)

@return

/

public <T,S> T copy(T t, S s){

try {

setValueToBean(t,s);

} catch (IllegalArgumentException e) {

eprintStackTrace();

} catch (IllegalAccessException e) {

eprintStackTrace();

}

return t;

}

/

@描述:查询该对象的所有构造方法(包含私有方法)

@param <T>

@param t

/

public <T>void displayAllConstructor(T t){

for(int i=0;i<tgetClass()getDeclaredConstructors()length;i++){

Systemoutprintln(tgetClass()getDeclaredConstructors()[i]);

}

}

/

@描述:查询该对象的所有方法(包含私有方法)

@param <T>

@param t

/

public <T> void displayAllMethod(T t){

for(int i=0;i<tgetClass()getDeclaredMethods()length;i++){

Systemoutprintln(tgetClass()getDeclaredMethods()[i]);

}

}

/

@描述:查询该对象的所有字段(包含私有方法)

@param <T>

@param t

/

public <T> void displayAllField(T t){

for(int i=0;i<tgetClass()getDeclaredFields()length;i++){

Systemoutprintln(tgetClass()getDeclaredFields()[i]);

}

}

//后面的代码删除了。。因过长

java中利用反射获取方法:

1先找到方法所在类的字节码

2找到需要被获取的方法

Class类中获取方法:

public Method[] getMethods();获取包括自身和继承(实现)过来的所有的public方法——Method不支持泛型<>,即后面不接<>

public Method[] getDeclaredMethods();获取自身所有的方法(private、public、protected,和访问权限无关),不包括继承的

public Method[] getMethod(String methodName, Class<T>parameterTypes);表示获取指定的一个公共的方法,包括继承的

参数: methodName:表示获取的方法的名字

parameterTypes:表示获取的方法的参数的Class类型

public Method[] getDeclaredMethod(String methodName, Class<T>parameterTypes);//表示获取本类中的一个指定的方法(private、protected、public,与访问权限无关),不包括继承的方法。

参数:methodName: 表示被调用方法的名字

parameterTypes:表示被调用方法的参数的Class类型如Stringclass只有通过方法签名才能找到唯一的方法,方法签名=方法名+参数列表(参数类型、参数个数、参数顺序)。

public Method getDeclaredMethod(String name,Class parameterTypes):表示调用指定的一个本类中的方法(不包括继承的)

参数: methodName: 表示被调用方法的名字

parameterTypes:表示被调用方法的参数的Class类型如Stringclass

举例:

class P{

public void t1(){}

void t2(){}

private void t3(){}

}

class People extends P{

public void sayHi() {

    Systemoutprintln("sayHi()");

}

public void sayHello(String name) {

    Systemoutprintln("sayHello(String name)   " + "name = " + name);

}

private void sayGoodBye(String name, int age) {

    Systemoutprintln("sayGoodBye(String name, int age)   " + "name = " + name + "  age = " + age);

}

}

public class MethodDemo {

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

    Class clazz = Peopleclass;

    //获取类自身及父类所有public方法

    Method ms[] = clazzgetMethods();

    for (Method m : ms) {

        Systemoutprintln(m);

    }

    Systemoutprintln("---------------------------");

    //获取类自身所有方法(不会获取父类方法)

    ms = clazzgetDeclaredMethods();

    for (Method m : ms) {

        Systemoutprintln(m);

    }

    Systemoutprintln("---------------------------");

    //只能获取父类中的public方法,无法获取到父类的默认权限和private权限方法

    Method m = clazzgetMethod("t1", null);//public void comreflexPt1()

    Systemoutprintln(m);

    m = clazzgetMethod("sayHello", Stringclass);

    Systemoutprintln(m);

    //Exception in thread "main" javalangNoSuchMethodException: comreflexPeoplesayGoodBye(javalangString, int)

    //getMethod方法只能获取public的

//        m = clazzgetMethod("sayGoodBye", Stringclass,intclass);

//        Systemoutprintln(m);

    m = clazzgetDeclaredMethod("sayGoodBye", Stringclass,intclass);

    Systemoutprintln(m);

    //带Declared的无法获取父类中的方法

//        m = clazzgetDeclaredMethod("t1", null);//Exception in thread "main" javalangNoSuchMethodException:comreflexPeoplet1()

//        Systemoutprintln(m);

}

}

Class<> obj=ClassforName(refgetClass()getName());

Object object = objnewInstance();

Method method=objgetMethod("getLength");

你这样拿到的是你newInstance新构建的对象,又不是你之前设定了值的对象,域当然会是0

应该是这样:methodinvoke(ref)

1、Test t = new Test()Class clazz = tgetClass()Systemoutprintln(clazzgetCanonicalName())Systemoutprintln(clazzgetSimpleName())

2、public class TestReflect {public static void main(String[] args) throws Exception {TestReflect testReflect = new TestReflect()Systemoutprintln(testReflectgetClass()getName())// 结果 netxsoftlabbaikeTestReflect}}

3、Java程序

以上就是关于在JAVA中,怎么利用反射获取一个方法全部的内容,包括:在JAVA中,怎么利用反射获取一个方法、java怎么样使用class反射!!!、在JAVA中,怎么利用反射获取一个方法等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9481387.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-28
下一篇2023-04-28

发表评论

登录后才能评论

评论列表(0条)

    保存