前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java反射学习笔记

java反射学习笔记

作者头像
张俊怡
发布2018-04-24 13:37:19
5260
发布2018-04-24 13:37:19
举报
文章被收录于专栏:深度学习计算机视觉

首先搞清楚什么是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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017.01.22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档