java反射可以获取源码吗_java反射获取实例

hacker|
105

文章目录:

JAVA中反射是什么

JAVA中反射是动态获取信息以及动态调用对象方法的一种反射机制。

Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。而这也是Java被视为动态语言的一个关键性质。

Java反射的功能是在运行时判断任意一个对象所属的类,在运行时构造任意一个类的对象,在运行时判断任意一个类所具有的成员变量和方法,在运行时调用任意一个对象的方法,生成动态代理。

扩展资料:

JAVA中反射实例:

1、Class superClass=clazz.getSuperclass();//获取父类。

System.out.println("getSuperclass:"+superClass)。   

2、Class[] interfaces=clazz.getInterfaces();//获取实现接口。

System.out.println("getInterfaces:"+interfaces.length)。

3、Constructor[] cons=clazz.getConstructors();//构造方法。

System.out.println("getConstructors:"+cons.length)。

参考资料来源:百度百科: JAVA反射机制

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

java中利用反射获取方法:

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

2.找到需要被获取的方法

Class类中获取方法:

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

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

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

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

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

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

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

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

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

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

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

举例:

class P{

public void t1(){}

void t2(){}

private void t3(){}

}

class People extends P{

public void sayHi() {

    System.out.println("sayHi()");

}

public void sayHello(String name) {

    System.out.println("sayHello(String name)   " + "name = " + name);

}

private void sayGoodBye(String name, int age) {

    System.out.println("sayGoodBye(String name, int age)   " + "name = " + name + "  age = " + age);

}

}

public class MethodDemo {

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

    Class clazz = People.class;

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

    Method ms[] = clazz.getMethods();

    for (Method m : ms) {

        System.out.println(m);

    }

    System.out.println("---------------------------");

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

    ms = clazz.getDeclaredMethods();

    for (Method m : ms) {

        System.out.println(m);

    }

    System.out.println("---------------------------");

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

    Method m = clazz.getMethod("t1", null);//public void com.reflex.P.t1()

    System.out.println(m);

    m = clazz.getMethod("sayHello", String.class);

    System.out.println(m);

    //Exception in thread "main" java.lang.NoSuchMethodException: com.reflex.People.sayGoodBye(java.lang.String, int)

    //getMethod方法只能获取public的

//        m = clazz.getMethod("sayGoodBye", String.class,int.class);

//        System.out.println(m);

    m = clazz.getDeclaredMethod("sayGoodBye", String.class,int.class);

    System.out.println(m);

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

//        m = clazz.getDeclaredMethod("t1", null);//Exception in thread "main" java.lang.NoSuchMethodException:com.reflex.People.t1()

//        System.out.println(m);

}

}

java反射机制可以调用到私有方法,是不是就破坏了JAVA的卦装性呢。

这是一个很值得探讨的问题,许多人接触反射时,对反射功能之强大都会抱有怀疑,感觉严重破坏了封装的性质。可是,什么是封装,什么是安全呢?

封装,是将具体的实现细节隐藏,而把功能作为整体提供给类的外部使用,也就是说,公有方法能够完成类所具有的功能。当别人使用这个类时,如果通过反射直接调用私有方法,可能根本实现不了类的功能,甚至可能会出错,因此通过反射调用私有方法可以说是没有任何用处的,开发人员没有必要故意去破坏封装好的类。从这点上看,封装性并没有被破坏。

所谓安全,如果意思是保护实现源码不被别人看见,那没有作用。不用反射也能轻易获取源码。

所以我以为反射机制只是提供了一种强大的功能,使得开发者能在封装之外,按照特定的需要实现一些功能。就好比核技术,虽然造核弹很危险吧,但造核电站还是很有用处的(这个比喻似乎不是很恰当,将就将就)。

曾经给朋友讨论过这个问题,感觉解释得不是很清楚,大家一起探讨探讨,看看怎样表述才能更容易理解:)

java的反编译是通过反射来实现的么

可以,但是不会这么干,因为反射看不到实现

首先在正常情况下,很多软件平台是不能直接读取.class文件的,所有只能把他转化成.java文件,而反射就是通过java库中带有的可以读取.class文件方法,通过程序的方式将其读取,并通过文件操作将其内容转化成.java文件即可。如:

String url = System.getProperty("user.dir") + "\\src\\" + path + "\\generated\\"+ clazz.getSimpleName()+ ".java";

fileWriter = new FileOutputStream(url)

java 能获得某个方法的代码内容么

可以的,只要将你写的方法设定一个返回的参数,用java直接调用这个方法就可以的。。。。

Java反射机制如何获取到d盘下.Java文件中类的信息,只知道.java的名字以及类名

.java文件是源代码文件,必须要编译成.class文件才能被JVM加载。使用Class.forName(类全名)动态加载类到jvm中。class文件必须位于classpath环境变量中的路径下。

5条大神的评论

  • avatar
    访客 2022-07-07 上午 02:28:14

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

  • avatar
    访客 2022-07-07 上午 06:42:29

    类型如String.class只有通过方法签名才能找到唯一的方法,方法签名=方法名+参数列表(参数类型、参数个数、参数顺序)。public Method getDeclaredMethod(String name,Class... parameterTypes)

  • avatar
    访客 2022-07-07 上午 07:12:34

    tln(m);    //Exception in thread "main" java.lang.NoSuchMethodException: com.reflex.People.sayGoodBye(java.lang.String, int)    //getMethod方法只能获取

  • avatar
    访客 2022-07-07 上午 04:34:38

    etMethods();获取包括自身和继承(实现)过来的所有的public方法——Method不支持泛型,即后面不接public Method[] getDeclaredMethods();获取自身所有的方法(private、public、protected,和访问权限无关

  • avatar
    访客 2022-07-07 上午 03:35:08

    m);    m = clazz.getMethod("sayHello", String.class);    System.out.println(m);    //Exception in thread "main" java.lang.NoSuchMethodExcepti

发表评论