
利用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中如何获取方法名字等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)