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方法


相关代码


java反射学习笔记_第1张图片
运行代码


运行结果

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

/**

* 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反射学习笔记_第2张图片
运行结果

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

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

你可能感兴趣的:(java反射学习笔记)