从接触java开始,很少使用过反射,记得只有在去年做一个舆情项目的时候,用反射做过一个代理模式来判断抓取的哪个网站的数据。先说说自己对反射的理解吧。
反射的原理:
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。
这个是从网站上粘的,是比较官方的定义。但是很抽象很笼统,我自己的理解是:反射就是程序在编译时并不知道此类,也就是不会将此类加载到内存(有关java类加载的理解以后会增加),当程序运行到此处时,才加载此类,探知它的结构。从而可以实例化对象,调用方法。
我理解的反射的好处有以下这么几个:
(1)在设计通用类时可以使用,比如在JDBC时,javabean与数据库的字段之间如果是一一对应的,则可以用反射设计通用的方法,实现对数据库的操作。可以大大减少重复代码。
(2)反射用在代理模式时可以大大减小耦合度。例如,在dao层,对数据的持久化可以采用jdbc,ibatis,hibernate等多种方法,业务层可以通过配置文件来获取使用哪个类,从而可以动态的加载该类,从而实例化该类对象。在以后变更持久层接口是只需要重写配置文件,不需要重新修改代码,然后卸载和安装。
(3)很多设计框架都使用了反射技术,比如spring,struts2 等,对于android开发,反射技术显得更加重要。
下面开始说说反射的基础api:
根据自己的理解和网上的很多资料,总结出使用反射主要的是关注:构造器,成员变量和成员方法。构造器产生实例对象,成员变量为该对象赋予属性,方法为该对象赋予行为。
(1)获取Class类对象:所有类其实都是Class的实例。
class Demo{ //codes... } class Test{ public static void main(String[] args) { Class<?> demo1=null; Class<?> demo2=null; Class<?> demo3=null; try{ //一般尽量采用这种形式 demo1=Class.forName("Reflect.Demo"); }catch(Exception e){ e.printStackTrace(); } demo2=new Demo().getClass();//通过类的对象获取该类的Class实例 demo3=Demo.class;//通过类获取它的Class实例 System.out.println("类名称 "+demo1.getName()); System.out.println("类名称 "+demo2.getName()); System.out.println("类名称 "+demo3.getName()); } }(2)通过无参构造器实例化类对象
Class<?>demo=Class.forName('包名.Demo'); Object obj=demo.newInstance();如果此Demo定义时取消了无参构造器,也就是说有有参构造器没有无参构造器,则会出现java.lang.InstantiationException异常;
(3) 构造器
package Reflect;
import java.lang.reflect.Constructor;
class Person{
public Person() {
}
public Person(String name){
this.name=name;
}
public Person(int age){
this.age=age;
}
public Person(String name, int age) {
this.age=age;
this.name=name;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public String toString(){
return "["+this.name+" "+this.age+"]";
}
private String name;
private int age;
}
public class Test{
public static void main(String[] args) {
Class<?> demo=null;
try{
demo=Class.forName("Reflect.Person");
}catch (Exception e) {
e.printStackTrace();
}
Person per1=null;
Person per2=null;
Person per3=null;
Person per4=null;
Person per5=null;
try{
Constructor<?> cons[]=demo.getConstructors(); //取得全部的构造函数
Constructor<?>con=demo.getConstructor(new Class[]{String.class});//取得某一个构造函数
per1=(Person)cons[0].newInstance();
per2=(Person)cons[1].newInstance("Rollen");
per3=(Person)cons[2].newInstance(20);
per4=(Person)cons[3].newInstance("Rollen",20);
per5=(Person)con.newInstance(new Object[]{"某个构造函数"});
}catch(Exception e){
e.printStackTrace();
}
System.out.println(per1);
System.out.println(per2);
System.out.println(per3);
System.out.println(per4);
System.out.println(per5);
}
}
其他的api将会在下一篇博客中详细介绍
相关推荐
基于计算机软件开发的JAVA编程应用初探.pdf
软件工程专业Java教学初探.pdf
基于计算机软件开发的JAVA编程应用初探
初探WSDL2JAVA工具的使用初探WSDL2JAVA工具的使用初探WSDL2JAVA工具的使用初探WSDL2JAVA工具的使用初探WSDL2JAVA工具的使用初探WSDL2JAVA工具的使用初探WSDL2JAVA工具的使用
title: java8 初探——interface defaultdate: 2015-12-08 00:00:02 #发表日期,一般不改动categorie
Java教学方法初探
NULL 博文链接:https://samyou.iteye.com/blog/1001781
高职Java课程设计初探
Java高级编程课程思政案例教学初探.pdf
应用型本科Java课程教学方法初探.pdf
物联网专业的Java课程改革初探.pdf
java泛型的高级用法demo
基于游戏开发的Java语言教学初探
应用型本科Java课程教学方法初探
Java本地接口(Java Native Interface (JNI))允许运行在Java虚拟机(Java Virtual Machine (JVM))上的代码调用本地程序和类库,或者被它们调用,这些程序和类库可以是其它语言编写的,比如C、C++或者汇编语言。...
基于游戏开发的Java语言教学初探.pdf
基于游戏开发的Java语言教学初探
基于游戏开发的Java语言教学初探.docx
基于Java的开源GIS编程教学初探.pdf