一,先看一下反射的概念:

主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。

反射是java中一种强大的工具,能够使我们很方便的创建灵活的代码,这些代码可以再运行时装配,无需在组件之间进行源代码链接。但是反射使用不当会成本很高!

看概念很晕的,继续往下看。

二,反射机制的作用:

1,反编译:.class-->.java

2,通过反射机制访问java对象的属性,方法,构造方法等;

这样好像更容易理解一些,下边我们具体看怎么实现这些功能。

三,在这里先看一下sun为我们提供了那些反射机制中的类:

    java.lang.Class;

    java.lang.reflect.Constructor; java.lang.reflect.Field;

    java.lang.reflect.Method;

    java.lang.reflect.Modifier;

很多反射中的方法,属性等操作我们可以从这四个类中查询。还是哪句话要学着不断的查询API,那才是我们最好的老师。

四,具体功能实现:

1,反射机制获取类有三种方法,我们来获取Employee类型

  1. //第一种方式:
  2. Classc1 = Class.forName("Employee");
  3. //第二种方式:
  4. //java中每个类型都有class 属性.
  5. Classc2 = Employee.class;
  6. //第三种方式:
  7. //java语言中任何一个java对象都有getClass 方法
  8. Employeee = new Employee();
  9. Classc3 = e.getClass(); //c3是运行时类 (e的运行时类是Employee)

2,创建对象:获取类以后我们来创建它的对象,利用newInstance:

  1. Class c =Class.forName("Employee");
  2. //创建此Class 对象所表示的类的一个新实例
  3. Objecto = c.newInstance(); //调用了Employee的无参数构造方法.

3,获取属性:分为所有的属性和指定的属性:

a,先看获取所有的属性的写法:

  1. //获取整个类
  2. Class c = Class.forName("java.lang.Integer");
  3. //获取所有的属性?
  4. Field[] fs = c.getDeclaredFields();
  5. //定义可变长的字符串,用来存储属性
  6. StringBuffer sb = new StringBuffer();
  7. //通过追加的方法,将每个属性拼接到此字符串中
  8. //最外边的public定义
  9. sb.append(Modifier.toString(c.getModifiers()) + " class " + c.getSimpleName() +"{\n");
  10. //里边的每一个属性
  11. for(Field field:fs){
  12. sb.append("\t");//空格
  13. sb.append(Modifier.toString(field.getModifiers())+" ");//获得属性的修饰符,例如public,static等等
  14. sb.append(field.getType().getSimpleName() + " ");//属性的类型的名字
  15. sb.append(field.getName()+";\n");//属性的名字+回车
  16. }
  17. sb.append("}");
  18. System.out.println(sb);

b,获取特定的属性,对比着传统的方法来学习:

  1. public static void main(String[] args) throws Exception{
  2. <span style="white-space:pre">  </span>//以前的方式:
  3. /*
  4. User u = new User();
  5. u.age = 12; //set
  6. System.out.println(u.age); //get
  7. */
  8. //获取类
  9. Class c = Class.forName("User");
  10. //获取id属性
  11. Field idF = c.getDeclaredField("id");
  12. //实例化这个类赋给o
  13. Object o = c.newInstance();
  14. //打破封装
  15. idF.setAccessible(true); //使用反射机制可以打破封装性,导致了java对象的属性不安全。
  16. //给o对象的id属性赋值"110"
  17. idF.set(o, "110"); //set
  18. //get
  19. System.out.println(idF.get(o));
  20. }

4,获取方法,和构造方法,不再详细描述,只来看一下关键字:

方法关键字

含义

getDeclaredMethods()

获取所有的方法

getReturnType()

获得方法的放回类型

getParameterTypes()

获得方法的传入参数类型

getDeclaredMethod("方法名",参数类型.class,……)

获得特定的方法

构造方法关键字

含义

getDeclaredConstructors()

获取所有的构造方法

getDeclaredConstructor(参数类型.class,……)

获取特定的构造方法

父类和父接口

含义

getSuperclass()

获取某类的父类

getInterfaces()

获取某类实现的接口

这样我们就可以获得类的各种内容,进行了反编译。对于JAVA这种先编译再运行的语言来说,反射机制可以使代码更加灵活,更加容易实现面向对象。

五,反射加配置文件,使我们的程序更加灵活:

在设计模式学习当中,学习抽象工厂的时候就用到了反射来更加方便的读取数据库链接字符串等,当时不是太理解,就照着抄了。看一下.NET中的反射+配置文件的使用:

当时用的配置文件是app.config文件,内容是XML格式的,里边填写链接数据库的内容:

  1. <configuration>
  2. lt;appSettings>
  3. <add     key=""  value=""/>
  4. lt;/appSettings>
  5. </configuration>

反射的写法:

  1. assembly.load("当前程序集的名称").CreateInstance("当前命名空间名称".要实例化的类名);

这样的好处是很容易的方便我们变换数据库,例如我们将系统的数据库从SQL Server升级到Oracle,那么我们写两份D层,在配置文件的内容改一下,或者加条件选择一下即可,带来了很大的方便。

当然了,JAVA中其实也是一样,只不过这里的配置文件为.properties,称作属性文件。通过反射读取里边的内容。这样代码是固定的,但是配置文件的内容我们可以改,这样使我们的代码灵活了很多!

综上为,JAVA反射的再次学习,灵活的运用它,能够使我们的代码更加灵活,但是它也有它的缺点,就是运用它会使我们的软件的性能降低,复杂度增加,所以还要我们慎重的使用它。

java中的反射机制_____的更多相关文章

  1. java中的反射机制在Android开发中的用处

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

  2. 浅说Java中的反射机制(二)

    写过一篇Java中的反射机制,不算是写,应该是抄了,因为那是别人写的,这一篇也是别人写的,摘抄如下: 引自于Java基础--反射机制的知识点梳理,作者醉眼识朦胧.(()为我手记) 什么是反射? 正常编 ...

  3. 浅说Java中的反射机制(一)

    在学习传智播客李勇老师的JDBC系列时,会出现反射的概念,由于又是第一次见,不免感到陌生.所以再次在博客园找到一篇文章,先记录如下: 引用自java中的反射机制,作者bingoideas.(()为我手 ...

  4. 【Java基础】java中的反射机制与动态代理

    一.java中的反射机制 java反射的官方定义:在运行状态下,可以获取任意一个类的所有属性和方法,并且可通过某类任意一对象实例调用该类的所有方法.这种动态获取类的信息及动态调用类中方法的功能称为ja ...

  5. java 中利用反射机制获取和设置实体类的属性值

    摘要: 在java编程中,我们经常不知道传入自己方法中的实体类中到底有哪些方法,或者,我们需要根据用户传入的不同的属性来给对象设置不同的属性值,那么,java自带的反射机制可以很方便的达到这种目的,同 ...

  6. Java 中的反射机制

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

  7. 深入理解Java中的反射机制

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

  8. Java中的反射机制和动态代理

    一.反射概述 反射机制指的是Java在运行时候有一种自观的能力,能够了解自身的情况为下一步做准备,其想表达的意思就是:在运行状态中,对于任意一个类,都能够获取到这个类的所有属性和方法:对于任意一个对象 ...

  9. Java中的反射机制Reflection

    目录 什么是反射? 获取.class字节码文件对象 获取该.class字节码文件对象的详细信息 通过反射机制执行函数 反射链 反射机制是java的一个非常重要的机制,一些著名的应用框架都使用了此机制, ...

随机推荐

  1. UITableView的style详解

    在默认的UITableViewCell中,主要有三个系统控件,分别是两个Lable和一个imageView,两个Label,imageView(始终在最左边)的布局位置可以通过下面4个设置: UITa ...

  2. Js中call apply函数以及this用法

    this介绍: C#里this关键字的意义比较确定的.JavaScript的this关键字,随着函数使用场合不同,this的值会发生变化,感觉用法比较混乱,所以,现在是有必要整理一下的时刻了! 总结一 ...

  3. Tomcat中Context的配置

    Tomcat直接ip地址访问不用加端口和项目名 当我们开发完一个WEB项目 然后部署到tomcat下,正常情况下应该是这样访问:http://localhost:端口号/项目名 如果我们想让用户仅仅输 ...

  4. jQuery特殊符号转义

    我们在使用jquery选择器的时候 对一些ID属性中有特殊符号的地方需要进行转义. 列举部分如下: <input id="entity.username" type=&quo ...

  5. java正则表达式去除html标签

    当我们用ckeditor或其他一些在线文本编辑器的时候 内容里会有很多的标签 如下片段: <p><img alt="" src="/img/upload ...

  6. 鸟哥的LINUX私房菜基础篇第三版 阅读笔记 三 Linux磁盘与文件系统管理

    一.认识EXT2文件系统:     a.硬盘的组成:转动小马达+存储的磁盘+读写的机械臂     b.磁盘的一些概念              扇区为最小的物理储存单位,每个扇区为512B       ...

  7. Oracle用脚本语言导入SCOTT用户

    许多Oracle新手都遇到这样的问题,安装Oracle之后没有SCOTT用户,那就自己加入吧,打开Oracle 命令窗口复制下面SQL脚本直接输入就行了,包含了测试学习的DEPT.EMP.BONUS. ...

  8. MingQQ v1.0高仿版开源了,使用WebQQ协议实现了QQ客户端基本的聊天功能...

    MingQQ v1.0高仿版开源了,使用WebQQ协议实现了QQ客户端基本的聊天功能... MingQQ目前支持的功能如下:1.支持普通方式登录.验证码方式登录.注销.保持在线.改变在线状态.2.支持 ...

  9. 使用ServletContextListener和HttpSessionListener两种监听器实现记录当前网站在线人数

    web.xml中配置: <listener>    <listener-class>com.mcm.listener.ServletContextListenerImpl< ...

  10. ADS的go to命令

    我们有时候在一个函数右键没有看到“go to”选项,这是因为没有Make,要先Make之后才能使用go to 命令