java反射学习笔记

首先搞清楚什么是java反射机制(下面是百度百科的定义)

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

JAVA反射(放射)机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。

从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。但是JAVA有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。

Java反射机制主要提供了以下功能

1、在运行时判断任意一个对象所属的类;

2、在运行时构造任意一个类的对象;

3、在运行时判断任意一个类所具有的成员变量和方法;

4、在运行时调用任意一个对象的方法;生成动态代理;

哪里用到反射机制

学jdbc时用过一行代码,

Class.forName("com.mysql.jdbc.Driver.class").newInstance();但是那时候只知道那行代码是生成驱动对象实例,这就是反射,现在很多开框架都用到反射机制,hibernate、struts都是用反射机制实现的。

为什么要用反射机制

反射机制的优点就是可以实现动态创建对象和编译,体现出很大的灵活性,特别是在J2EE的开发中它的灵活性就表现的十分明显。

比如,一个大型的软件,不可能一次就把把它设计的很完美,当这个程序编译后,发布了,当发现需要更新某些功能时,我们不可能要用户把以前的卸载,再重新安装新的版本,假如这样的话,这个软件肯定是没有多少人用的。

采用静态的话,需要把整个程序重新编译一次才可以实现功能的更新,而采用反射机制的话,它就可以不用卸载,只需要在运行时才动态的创建和编译,就可以实现该功能。

缺点就是比较慢

因为反射方法调用还有验证过程和参数问题,参数需要装箱拆箱、需要组装成Object[]形式、异常的包装等等问题

常用的方法

Class c=Class.forName("className");注明:className必须为全名,也就是得包含包名,比如,cn.netjava.pojo.UserInfo;

Object obj=c.newInstance();//创建对象的实例

OK,有了对象就什么都好办了,想要什么信息就有什么信息了。

获得构造函数的方法

Constructor getConstructor(Class[] params)//根据指定参数获得public构造器

Constructor[] getConstructors()//获得public的所有构造器

Constructor getDeclaredConstructor(Class[] params)//根据指定参数获得public和非public的构造器

Constructor[] getDeclaredConstructors()//获得public的所有构造器

获得类方法的方法

Method getMethod(String name, Class[] params),根据方法名,参数类型获得方法

Method[] getMethods()//获得所有的public方法

Method getDeclaredMethod(String name, Class[] params)//根据方法名和参数类型,获得public和非public的方法

Method[] getDeclaredMethods()//获得所以的public和非public方法

获得类中属性的方法

Field getField(String name)//根据变量名得到相应的public变量

Field[] getFields()//获得类中所以public的方法

Field getDeclaredField(String name)//根据方法名获得public和非public变量

Field[] getDeclaredFields()//获得类中所有的public和非public方法


相关代码

运行代码

运行结果

通过反射机制调用某个类的方法

/**

* Created by junyi.pc on 2017/1/13.

*/

importjava.lang.reflect.Method;

public classHrefMatch {

public static voidmain(String[] args) {

try{

Class clazz = Class.forName("HrefMatch");

// 调用TestReflect类中的reflect1方法

Method method =  clazz.getMethod("reflect1");

method.invoke(clazz.newInstance());

// Java 反射机制 - 调用某个类的方法1.

// 调用TestReflect的reflect2方法

method = clazz.getMethod("reflect2",int.class, String.class);

method.invoke(clazz.newInstance(),20,"张三");

// Java 反射机制 - 调用某个类的方法2.

// age -> 20. name -> 张三

}catch(ClassNotFoundException e) {

e.printStackTrace();

}catch(NoSuchMethodException e) {

e.printStackTrace();

}catch(InstantiationException e) {

e.printStackTrace();

}catch(IllegalAccessException e) {

e.printStackTrace();

}catch(InvocationTargetException e) {

e.printStackTrace();

}

}

public voidreflect1() {

System.out.println("Java 反射机制 - 调用某个类的方法1.");

}

public voidreflect2(intage, String name) {

System.out.println("Java 反射机制 - 调用某个类的方法2.");

System.out.println("age -> "+ age +". name -> "+ name);

}

}

运行结果

下面链接的博客是对java反射应用于数据库的精彩解析,可以参考

www.cnblogs.com/jqyp/archive/2012/03/29/2423112.html

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 里式替换原则(LSP)

    讲继承 所有引用父类的地方都必须可以透明的使用其子类对象 几个原则: 1、子类必须完全实现父类的方法 2、子类可以有自己的个性 3、覆盖或实现父类的方...

    张俊怡
  • 小目标检测相关技巧总结

    小目标问题在物体检测和语义分割等视觉任务中一直是存在的一个难点,小目标的检测精度通常只有大目标的一半。

    张俊怡
  • 一些小算法代码,看各位能否看懂

    import java.util.Scanner; /** * Created by junyi.pc on 2017/1/25. */ public c...

    张俊怡
  • java反射的二三事

    一、什么是反射机制 简单的来说,反射机制指的是程序在运行时能够获取自身的信息。在java中,只要给定类的名字, 那么就可以通过反射机制来获得类的所有信息,诸...

    lyb-geek
  • java反射的二三事

    一、什么是反射机制 简单的来说,反射机制指的是程序在运行时能够获取自身的信息。在java中,只要给定类的名字, 那么就可以通过反射机制来获得类的所有信息,诸...

    lyb-geek
  • 【自然框架】 页面里的父类——把共用的东东都交给父类,让子类专注于其他。

    【类图】 ? 【命名空间】——————————————————【文件截图】 ? ? 可能您会问,不就是弄个父类吗,怎么又是这么复杂呢?这个嘛,听...

    用户1174620
  • springboot整合springsecurity框架,在项目里面集成生成公钥和私钥的代码(分布式项目)(四)

    之前我们已经可以使用工具类生成公钥和私钥了。因为我们现在的项目是分布式的项目,所以重新创建一个子项目,在这个子项目里面写我们生成token的代码

    一天不写程序难受
  • Android十八章:设计模式SOLID五大原则

    单一职责原则就是造成一个类改变的原因一个只有一个。再比如手机的电池是一个类,电池只为手机提供电源的职责。

    ppjun
  • Android十八章:多进程基础

    这一章主要讲述多进程的作用,序列化和反序列化,Serializable和Parcelable

    ppjun
  • 纳尼,程序员租房也有公式?

    目前全国各地的学生们都迎来了暑假,看着朋友圈00后们开心的秀着自己的假期,小编心里一万个羡慕啊!

    用户6543014

扫码关注云+社区

领取腾讯云代金券