java反射机制知识_Java反射机制讲解,程序员必须掌握的知识点

1c4d99555e03233258d27795b87d354b.png

关注程序员7歌,一起用技术改变世界

大家好,我是程序员7歌,今天我为大家讲解Java的反射机制。

首先我们来看看反射的概念:

Java反射说的就是在程序运行中,任何一个类,我们都可以知道这个类的方法和属性。对于任何一个Java对象,我们都可以对它的方法和属性进行调用。因此我们把这种动态获取Java对象信息和调用对象方法的功能称为Java反射机制。

如果我们想要使用Java的反射机制,必须要先获取该对象的字节码文件对象(.class),然后通过字节码文件对象,就能够通过该对象的方法获取我们想要的对象信息,比如:方法/属性/父类名/实现等所有接口信息等,每个对象对应着一个字节码文件(.class),也就是一个class类型的对象,既是字节码文件对象。

我们知道Java的一切操作都是在类中进行的,既万物皆是对象,类也是对象,是class的对象(类是对象,是java.lang.Class类的实例对象)

我们来看一个样例:class Test{},Test的实例对象就是Test test = new Test();我们知道Test类也是class的实例对象,因此Test的实例对象有三种表达式:

第一种:Class> ===> getClass() ===>返回Object的运行类,其实这个方法是Object的一个方法,Class继承了Object,因此我们可以直接使用。

public class Test {public static void main(String[] args) {//首先我们创建一个对象Test t1 = new Test();//然后获取这个类的Class对象Class c1 = t1.getClass();//然后获取这个类的名称System.out.println(c1.getName());}}

控制台输出内容如下:

com.test.controller.TestProcess finished with exit code 0

第二种:我们可以调用属性获取:

public class Test {public static void main(String[] args) {Class c1 = String.class;//然后获取这个类的名称System.out.println(c1.getName());}}

控制台输出内容如下:

Connected to the target VM, address: '127.0.0.1:64548', transport: 'socket'java.lang.StringDisconnected from the target VM, address: '127.0.0.1:64548', transport: 'socket'Process finished with exit code 0

第三种:可以使用forName方法获取,不过通过类的全路径获取Class对象会抛出一个异常,如果根据路径找不到这个类就会抛出异常,样例如下:

public class Test {public static void main(String[] args) {try{//根据类的全路径获取(必须用上全限定名,否则报错) Class c1 = Class.forName("com.test.controller.Test");System.out.println(c1.getName());}catch (Exception e){e.printStackTrace();}}}

控制台输出内容如下:

com.test.controller.TestProcess finished with exit code 0

在上面三种方法中,我们一般推荐第三种方式,因为第一种已经创建了对象,如果再用反射就是多此一举了;第二种我们需要导入类的相关包,类的依赖性太强了。因此我们推荐使用第三种方式。

接下来介绍几个方法,通过反射机制获取方法信息:

//获取所有的public的方法,包含父类继承的方法 c1.getMethods();

//获取所有该类自己声明的方法,不问访问权限是一个Method[]数组,得到方法的返回值类型的类类型Class c1.getDeclaredMethods()[i].getReturnType();

//得到参数列表的类型的类类型 Class[] c1.getDeclaredMethods()[i].getParameterTypes(); 我们样例看看如下:

public static void main(String[] args) {try{//跟据类的全路径获取Class c1 = Class.forName("com.test.controller.Test");Method[] methods = c1.getDeclaredMethods();for (int i = 0; i < methods.length; i++) {//返回方法的类型System.out.println(methods[i].getReturnType().getName());//方法名System.out.println(methods[i].getName());Class[] classes = methods[i].getParameterTypes();for (Class aClass : classes) {System.out.println(aClass.getName());}}}catch (Exception e){e.printStackTrace();}}

控制台输出内容如下:

voidmain[Ljava.lang.String;Process finished with exit code 0

接下来我们看看方法的反射:操作为:method.invoke(对象,参数列表),获取方法名称和参数列表决定,getMethod是获取public的方法,getDeclaredMethod获取自己申明的方法。

public class Test {public static void main(String[] args) {try{Test1 test1 = new Test1();Test2 test2 = new Test2();Class testClass1 = test1.getClass();Class testClass2 = test2.getClass();Method method1 = testClass1.getMethod("test1",int.class,int.class);method1.invoke(test1,1,2);Method method = testClass1.getMethod("test1");method.invoke(test1);Method method2 = testClass2.getMethod("test2", String.class, String.class);method2.invoke(test2,"zeng","xueqi");}catch (Exception e){e.printStackTrace();}}}class Test1{public void test1(){System.out.println("test1的方法");}public void test1(int a,int b) {System.out.print(a+b+"\n");}}class Test2{public void test2(String a,String b){System.out.println("test2的方法 ===> " + a + "/" + b);}}

控制台输出内容如下:

3test1的方法test2的方法 ===> zeng/xueqiProcess finished with exit code 0

看到这里我们大概已经对反射有一定的了解,可以使用反射来获取类的一些属性和方法,我们在使用一些主流的开发框架中用到反射机制的程序非常的广泛,因此我们反射机制还是有必要掌握的。

好了,今天就给大家介绍到这里吧,感谢大家观看喔~~❤️

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值