如何获取java类里的私有方法

如何获取java类里的私有方法,第1张

利用java的反射机制,以下代码:

public class Main {

private void fun(){

Systemoutprintln("this is my private method!");

}

private void fun2(String what) {

Systemoutprintln(what);

}

private static void fun3(){

Systemoutprintln("this is my private static method!");

}

}import javalangreflectInvocationTargetException;

import javalangreflectMethod;

public class Test {

public static void main(String[] args) {

try {

Class<> _class = ClassforName("Main");//名字填完整的包名类名  ,示例没有包因此只填类名

Object object = _classnewInstance();

Method method = _classgetDeclaredMethod("fun");//fun无参数,因此只要方法

methodsetAccessible(true);//私有方法设置可访问 

methodinvoke(object, new Object[0]);

Method method2 = _classgetDeclaredMethod("fun2",Stringclass);//有参数,需要参数的类别

method2setAccessible(true);

method2invoke(object, new String("test"));//传参数的值

Method method3 = _classgetDeclaredMethod("fun3");

method3setAccessible(true);

method3invoke(object,new Object[0]);//静态方法,object传null

} catch (ClassNotFoundException e) {

// TODO Auto-generated catch block

eprintStackTrace();

}

 catch (InstantiationException e) {

// TODO Auto-generated catch block

eprintStackTrace();

} catch (IllegalAccessException e) {

// TODO Auto-generated catch block

eprintStackTrace();

} catch (SecurityException e) {

// TODO Auto-generated catch block

eprintStackTrace();

} catch (NoSuchMethodException e) {

// TODO Auto-generated catch block

eprintStackTrace();

} catch (IllegalArgumentException e) {

// TODO Auto-generated catch block

eprintStackTrace();

} catch (InvocationTargetException e) {

// TODO Auto-generated catch block

eprintStackTrace();

}

}

}

在java方法中获得当前方法的名称方法:

一、获得当前类名:

Java代码

thisgetClass()getName();

二、获得当前方法名臣:

JDK14

Java代码

new   Exception()getStackTrace()[i]getMethodName();//其中i   =   0就是当前的类的方法名字 ;i   ==   1就是调用者的方法

JDK15之后可用

Java代码

ThreadcurrentThread()getStackTrace()[1]getMethodName();//具体使用数组的那个元素和JVM的实现有关,我在SUN JDK6下面测试的是第二个元素,具体说明可以查看ThreadgetStackTrace方法的javadoc

import javalangreflectMethod;

public class Users {

public void print() {

}

public void getName() {}

public static void main(String[] args) {

Class c = Usersclass;

Method m[] = cgetDeclaredMethods();

for (int i = 0; i < mlength; i++) {

Systemoutprintln("方法名" + m[i]getName());

}

}

}

完整代码如下:

public class ArgsTest {

    public static void main(String[] args) {

        argstest(args);

    }

    public static void argstest(String[] args) {

        Systemoutprintln(argslength);

        for (int i = 0; i < argslength; i++) {

            Systemoutprintln(args[i]);

        }

    }

}

public class Test {

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

// TODO Auto-generated method stub

A a=new A();

String i="setB";

Method cc=agetClass()getMethod(i, Stringclass);//获取方法

//Stringclass如果没有就是new Class[0]

Systemoutprintln(ccgetName());

ccinvoke(a, "aa");

//调用方法

Systemoutprintln(agetB());

}

}

class A{

private int a=0;

private String b="abc";

public int getA() {

return a;

}

public void setA(int a) {

thisa = a;

}

public String getB() {

return b;

}

public void setB(String b) {

thisb = b;

}

}

package commikan;

import javalangannotation;

/

 @author Mikan

 @date 2015-08-04 23:39

/

@Target(ElementTypePARAMETER)

@Retention(RetentionPolicyRUNTIME)

@Documented

public @interface Param {

String value();

}

获取注解中的参数名的工具类:

package commikan;

import javalangannotationAnnotation;

import javalangreflectMethod;

/

 @author Mikan

 @date 2015-08-05 00:26

/

public class ParameterNameUtils {

/

 获取指定方法的参数名

 @param method 要获取参数名的方法

 @return 按参数顺序排列的参数名列表

/

public static String[] getMethodParameterNamesByAnnotation(Method method) {

Annotation[][] parameterAnnotations = methodgetParameterAnnotations();

if (parameterAnnotations == null || parameterAnnotationslength == 0) {

return null;

}

String[] parameterNames = new String[parameterAnnotationslength];

int i = 0;

for (Annotation[] parameterAnnotation : parameterAnnotations) {

for (Annotation annotation : parameterAnnotation) {

if (annotation instanceof Param) {

Param param = (Param) annotation;

parameterNames[i++] = paramvalue();

}

}

}

return parameterNames;

}

}

测试类:

package commikan;

import javalangreflectMethod;

import javautilArrays;

/

 @author Mikan

 @date 2015-08-04 23:40

/

public class ParameterNameTest {

public void method1(@Param("parameter1") String param1, @Param("parameter2") String param2) {

Systemoutprintln(param1 + param2);

}

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

Class<ParameterNameTest> clazz = ParameterNameTestclass;

Method method = clazzgetDeclaredMethod("method1", Stringclass, Stringclass);

String[] parameterNames = ParameterNameUtilsgetMethodParameterNamesByAnnotation(method);

Systemoutprintln(ArraystoString(parameterNames));

}

}

用反射机制,简单写了一个例子,不懂的可以看一下相关api

public

class

OwerMethodParam

{

public

static

void

main(String[]

args)

{

new

OwerMethodParam()test("bb");

}

public

void

test(String

aa)

{

Method[]

methods

=

OwerMethodParamclassgetDeclaredMethods();

//取得这个类的所有方法

if

(methods

!=

null)

{

for

(int

i

=

0;

i

<

methodslength;

i++)

{

Method

method

=

methods[i];

if

("test"equals(methodgetName()))

{

//取得本方法,这个方法是test,所以就用test比较

Class

[]

paramsClass

=

methodgetParameterTypes();

//取得参数列表的所有类

if

(paramsClass

!=

null)

{

for

(Class

class1

:

paramsClass)

{

Systemoutprintln(class1getName());

}

}

break;

}

}

}

}

//通过包获取类对应的类对象

Class<> f= ClassforName("javaioFile");

//通过对象去获取对象对应的类的类对象

//File file=new File("");

Class<> f= filegetClass();

//通过类的class属性去获取类的类对象

Class<> f= Fileclass;

//获取方法的数组

Method[] methods= fgetMethods();

循环得到你想要的这 类中的方法,字段,属性

以上就是关于如何获取java类里的私有方法全部的内容,包括:如何获取java类里的私有方法、如何在java方法中获得当前方法的名称、java中如何获取方法名字等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

    保存