初识JAVA反射<一>_0626

反射

一.最开始接触javaSE的时候就没有怎么学过反射,感觉好难,老师讲的也很晦涩,然后就没有然后了,最近项目中用到了AOP切面编程,全都是运用的反射,不学不行了,索性问问过来人。

1.一种说法是java反射实际上就是转换,讲java代码转换为二进制。

2.第二种说法就是将javaBean什么的转换成你需要的形式。

现在给我的想法,我觉得在SpingMVC上就用到了反射,我前台的ajax传过来的值,可以直接传到我的Controller的参数中得类,比如说,

$.ajax{

....

data:{deptCode:deptCode,

    deptName:deptName

}

}

public void getDeptController(HttpsevletRequest req,Dept dept){

}

public class Dept{

  private String deptCode;

  private String deptName;

.....getter///setter///省略了

}

类似这样的一个例子,我自认为就是运用的反射,将穿过来的值,转换到javaBean当中去,然而具体的源代码我没有看过,还是觉得殊途同归,然后经过园子里的一位高人,在他的基础上,我改造了一下,算是初探java反射吧:

Java 反射机制是指Java程序可以在执行期载入,探知,使用编译期间完全未知的classes.这句话可能有点难以理解,我们可以通过一个例子来看。在Java程序中我们经常会用到这样一条语句来创建一个对象。Date date = new Date();在这条语句中date的类型(Java.util.Date)在编译时 已经确定。那么,有没有办法使我们把对象类型的确定时间由编译转到运行,答案是肯定的。这就是Java反射机制所提供的便利。而且它不单单可以生成对象还可以获取Field,对Field设值,及调用方法等。
  谈及Java反射机制就一定要知道一个名为“Class”的类,它是Java反射机制的基础。“Class”和其它类一样继承于Object类,它的实例对象用来描述Java运行时的一种类型,接口,或者原始类型(比如int).“Class”的实例要由JVM创建,它没有公用的构造方法。下面我们来看一下如何获得"Class"类实例。
  主要有三种方法。
     一,通过Class类的静态方法forName获取。Class cla = Class.forName("java.lang.String");
     二,通过.Type或.class属性获得。Class cla = String.class;Class cla1 = int.Type;
     三,通过实例变量的getClass方法获得。String s = ""; Class cla = s.getClass();
  如上所示实例对象cla就是对String类型的描述,通过它我们就可以创建一个String实例,并调用其中的方法。下一篇我将通过一个例子来展示如何使用Java反射机制。
JAVA反射机制
    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。

下面我以顾客买相机为例来说明Java反射机制的应用。例子中涉及的类和接口有:
Camera接口:定义了takePhoto()方法。
Camera01类:一种照相机的类型,实现Camera接口。
Camera02类:另一种照相机的类型,实现Camera接口。
Seller类:卖照相机。
Customer类:买相机,有main方法。

(转自http://www.cnblogs.com/ksyou/archive/2009/03/21/1418279.html)

具体的实现我还是上我自己的吧:

 1 package com.zxd.June_26;
 2
 3 public interface Camera {
 4     public void takePhoto();
 5 }
 6
 7
 8
 9 package com.zxd.June_26;
10
11 public class Camera01 implements Camera{
12     private int prefix = 300;
13     private String zoom = "10times";
14     public void takePhoto() {
15         System.out.println("Camera01 takes a photo!!");
16     }
17
18
19     public void takeVidio(){
20         System.out.println("Camera01 takes a video!!");
21     }
22
23 }
24
25
26
27 package com.zxd.June_26;
28
29 public class Customer {
30
31     public static void main(String[] args) throws Exception{
32
33         Seller seller = new Seller();
34         seller.getAttr("com.zxd.June_26.Camera01");
35
36         seller.getMethod("com.zxd.June_26.Camera01");
37
38         seller.testFunction("com.zxd.June_26.Camera01");
39     }
40
41 }
42
43
44
45 package com.zxd.June_26;
46
47 import java.lang.reflect.Field;
48 import java.lang.reflect.Method;
49
50 public class Seller {
51
52
53     public void getAttr(String args) throws Exception{
54             Class cla = Class.forName(args);
55             Object obj = cla.newInstance();
56             Field[] field = obj.getClass().getDeclaredFields();
57
58             for(int i = 0; i < field.length; i++){
59                 field[i].setAccessible(true);
60                 System.out.println("第"+i+"个成员变量为:"+field[i].getName()+"="+field[i].get(obj));
61             }
62
63     }
64
65     public void getMethod(String args) throws Exception{
66         Class cls = Class.forName(args);
67         Object obj = cls.newInstance();
68         Method[] method = obj.getClass().getDeclaredMethods();
69
70         for(int i = 0; i < method.length; i++){
71             System.out.println("第"+i+"个方法名为:"+method[i].getName() );
72         }
73     }
74
75     public void testFunction(String args) throws Exception{
76         Class cla = Class.forName(args);
77         Object obj = cla.newInstance();
78         Method[] method = obj.getClass().getDeclaredMethods();
79
80         for(int i = 0 ;i < method.length; i++){
81             String methodName = method[i].getName();
82
83             Method methodFunction = cla.getMethod(methodName, null);
84         //    System.out.println(methodFunction.getName());
85             System.out.print("遍历调用Camera的第"+i+"方法");
86             methodFunction.invoke(obj, null);
87         //    System.out.println(methodFunction.invoke(obj, null));;
88         }
89     }
90
91
92 }

测试结果为:

第0个成员变量为:prefix=300
第1个成员变量为:zoom=10times
第0个方法名为:takePhoto
第1个方法名为:takeVidio
遍历调用Camera的第0方法Camera01 takes a photo!!
遍历调用Camera的第1方法Camera01 takes a video!!

现在我还有一些问题,就是对于Method.invoke这个方法,请诸位等待我的第二个版本,我看看,在Method类下面有没有获得形参的方法,这样我就可以用invoke这个方法传递一些参数。

初识JAVA反射<一>_0626

时间: 2024-10-14 02:13:01

初识JAVA反射<一>_0626的相关文章

初识java反射机制

反射是动态性最大的体现 运行时才能改变编译期所确定的效果是编程语言的动态性. java动态性可以利用反射机制探究使用编译期未知的类 ,java反射计数是java程序的特征之一 它允许运行中的java程序对自身进行检查或者自审并能直接操作程序的内部属性 在一般的设计应用中使用步骤:一是获得要操作的类的class对象 二是探究class类中的信息(属性  构造  方法) 三是使用class对象中的信息如:使用构造产生对象的实例对象‘   使用属性的get/set方法   方法的调用等等 在反射机制里

初识Java反射

要详细的了解Java反射,就得要了解Java的类加载以及何为运行时动态加载等等概念.本文抛开其余概念,简单介绍Java反射,详细介绍会在以后有一个系统而全面的认识过后展开. 反射是Java被视为动态语言的关键,它允许程序在运行时取得任何类的内部信息.Java的这个能力或许在Web应用中用得不是很多,但在一些Java组件开发过程中非常常见,比如Spring.Hibernate等都以此为基础.了解并熟知Java反射机制对我们了解Java框架有很大的帮助. 我们首先写好一个Test类,并将它编译为cl

java反射教程

什么是反射,为什么它是有用的,以及如何使用它? 1.什么是反射? "反射通常是JVM中运行的程序需要检测和修改运行时程序的行为的一种能力."这个概念通常与内省(Introspection)混淆.以下是这两个术语在维基百科中的定义: 内省是指计算机程序在运行时检查对象类型的一种能力,通常也可以称作运行时类型检查. 反射是指计算机程序在运行时可以访问.检测和修改它本身状态或行为的一种能力. 从他们的定义可以看出,内省是反射的一个子集.有些语言支持内省,但不支持反射,如C++. 内省例子:i

初识JAVA(【面向对象】:pub/fri/pro/pri、封装/继承/多态、接口/抽象类、静态方法和抽象方法;泛型、垃圾回收机制、反射和RTTI)

JAVA特点: 语法简单,学习容易 功能强大,适合各种应用开发:J2SE/J2ME/J2EE 面向对象,易扩展,易维护 容错机制好,在内存不够时仍能不崩溃.不死机 强大的网络应用功能 跨平台:JVM,字节码 两个命令: javac helloworld.java:将Java文件编译为字节码的.class文件 java helloworld:运行Java程序...??暂时这么认为 数据类型: 普通数据类型:int a=3; 对象数据类型:使用关键字new,String s=new String("

初识Java Web

初识Java Web 系统学习Java Web也有一周时间了,整理一下这一周中接触到的新概念以及根据这一周的所学知识完成的一个基于JSP+Servlet+Java Bean+MySql的留言板Demo 几个概念 tomcat tomcat是一个"Web App Server",底层是Socket的一个程序,是JSP/Servlet的一个容器,简单来说,当我们在我们电脑本地编写HTML,css时,我们写的页面只能自己访问,别人不能远程访问我们写的页面,而tomcat就是一个能让别人访问自

Java反射

1. 介绍 反射是一种能够在程序运行时动态访问.修改某个类中任意属性和方法的机制. 具体:对于任意一个类,都能够知道这个类的所有属性和方法对于任意一个对象,都能够调用它的任意一个方法和属性 在运行时,当加载完类之后,JVM在堆内存中会自动产生一个Class类型的对象,这个对象包含了完整的类的结构信息 这个Class对象就像一面镜子,透过这个镜子看到类的结构 那么,如何得到这个Class对象呢?以下可否 Class c = new Class(); 答案是不行的,因为Class的构造函数定义为私有

Java 反射详解

反射反射,程序员的快乐,今天你快乐了吗?如果你不快乐,没关系,接下来让你快乐起来! 一.什么是反射? 通过百度百科我们可以知道,Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:并且能改变它的属性.而这也是Java被视为动态(或准动态,为啥要说是准动态,因为一般而言的动态语言定义是程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言.从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C

java反射机制(一)—— 利用反射机制实例化对象

一.Java有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载.探知.使用编译期间完全未知的classes.换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体.或对其fields设值.或唤起其methods.(度娘文库是这么说的) 二.这篇文章主要介绍一下通过反射机制去实例化一个类的对象,然后调用其方法.本文主要介绍两种方式,第一种就是通过构造函数来实例化,第二种就是通过Cl

java 反射 详解

本文来自:blog.csdn.net/ljphhj JAVA反射机制:   通俗地说,反射机制就是可以把一个类,类的成员(函数,属性),当成一个对象来操作,希望读者能理解,也就是说,类,类的成员,我们在运行的时候还可以动态地去操作他们. 理论的东东太多也没用,下面我们看看实践 Demo - Demo: package cn.lee.demo; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import