Java方法的反射(对反射的进一步认识)
目录理论实例理论这是学Java反射的第三天了,今天对Java反射有了新的认识,个人觉得,Java的反射,实际上是存在一个对象的副本。这个对象的副本实际上是一个Class指针(Java里面没有指针的概念,这里为了理解,特意搬出来的),然而这个Class指针估计是保存在Java虚拟机里面的,都会存在对象的类类型的指针到Java虚拟机里面,因为在Java中,处处都是对象...
·
目录
理论
这是学Java反射的第三天了,今天对Java反射有了新的认识,个人觉得,Java的反射,实际上是存在一个对象的副本。这个对象的副本实际上是一个Class指针(Java里面没有指针的概念,这里为了理解,特意搬出来的),然而这个Class指针估计是保存在Java虚拟机里面的,都会存在对象的类类型的指针到Java虚拟机里面,因为在Java中,处处都是对象,连函数也是对象。所以可以直接调用函数方法。
方法的反射
如何获取某个方法:方法的名称和方法的参数列表才能唯一决定某个方法。
【注意,Java不是C++,函数的返回值不同的话,也是相同的函数】
方法反射的操作:method.invoke(对象, 参数列表)
实例
程序结构如下:
运行截图如下:
源码如下!
MethodDemo.java
package my;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class MethodDemo {
public static void main(String[] args) {
/**
* 获取类的方法,首先要获取类的类型
*/
Test a1 = new Test();
Class c = a1.getClass();
/**
* 获取方法 名称和参数列表来决定
* getMethod获取的是public方法
* getDelcaredMethod是自己声明的方法
*/
try {
Method m = c.getMethod("print", new Class[] {int.class, int.class});
//Method m = c.getMethod("print", int.class, int.class);
/**
* 使用invoke进行反射的调用
*/
try {
Object o = m.invoke(a1, new Object[] {10, 20});
//方式二
o = m.invoke(a1, 20, 30);
System.out.println("----------华丽的分割线----------");
Method mStr = c.getMethod("print", new Class[] {String.class, String.class});
o = mStr.invoke(a1, new String[]{"how", "are"});
System.out.println("----------华丽的分割线----------");
Method mNull = c.getMethod("print");
mNull.invoke(a1);
}
catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class Test{
public void print() {
System.out.println("helloWorld");
}
public void print(int a, int b) {
System.out.println(a + b);
}
public void print(String a, String b) {
System.out.println(a.toUpperCase() + "," + b.toUpperCase());
}
}
更多推荐
已为社区贡献16条内容
所有评论(0)