文章目录:
- 1、JAVA中反射是什么
- 2、在JAVA中,怎么利用反射获取一个方法
- 3、java反射机制可以调用到私有方法,是不是就破坏了JAVA的卦装性呢。
- 4、java的反编译是通过反射来实现的么
- 5、java 能获得某个方法的代码内容么
- 6、Java反射机制如何获取到d盘下.Java文件中类的信息,只知道.java的名字以及类名
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环境变量中的路径下。
取方法:public Method[] getMethods();获取包括自身和继承(实现)过来的所有的public方法——Method不支持泛型,即后面不接public Met
类型如String.class只有通过方法签名才能找到唯一的方法,方法签名=方法名+参数列表(参数类型、参数个数、参数顺序)。public Method getDeclaredMethod(String name,Class... parameterTypes)
tln(m); //Exception in thread "main" java.lang.NoSuchMethodException: com.reflex.People.sayGoodBye(java.lang.String, int) //getMethod方法只能获取
etMethods();获取包括自身和继承(实现)过来的所有的public方法——Method不支持泛型,即后面不接public Method[] getDeclaredMethods();获取自身所有的方法(private、public、protected,和访问权限无关
m); m = clazz.getMethod("sayHello", String.class); System.out.println(m); //Exception in thread "main" java.lang.NoSuchMethodExcepti