反射问题

原创 2011年01月09日 21:16:00

Class类介绍:
    Java类用于描述一类事物的共性,该类事物有什么属性,没有什么属性,至于这个属性的值是什么,则是由这个类的实例对象来确定的,不同的实例对象有不同的属性值。Java程序中的各个Java类,它们是否属于同一类事物,是不是可以用一个类来描述这类事物呢?这个类的名字就是Class,要注意与小写class关键字的区别。Class类描述了哪些方面的信息呢?类的名字,类的访问属性,类所属于的包名,字段名称的列表、方法名称的列表,等等。学习反射,首先要明白Class这个类。

Class类代表Java类,它的各个实例对象又分别对应什么呢?
 Class 类的实例表示正在运行的 Java 应用程序中的类和接口。
如何得到各个字节码对应的实例对象(Class类型)
*类名.class。例如:System.class
*对象getClass()。例如:new Date().getClass()
*Class.forName("类名")。例如:Class.forName("java.util.Date")

九个预定义Class实例对象:
    表示八个基本类型和void。这些类对象由Java虚拟机创建,与其表示的基本类型同名,即boolean、byte、char、short、int、long、float和double。
查看JDK帮助文档,isPrimitive方法的帮助:
int.class==Integer.TYPE

总之,只要是在源程序中出现的类型,都有各自的Class实例对象,例如,String,int[],void.


反射:
*反射就是把Java类中的各种成分映射成相应的java类。例如,一个Java类中用一个Class类的对象来表示,一个类中的组成部分:成员变量,方法,构造方法,包等等信息也用一个个的Java类来表示,就像汽车是一个类,汽车中的发动机,变速箱等等也是一个个的类。表示Java类的Class类显然要提供一系列的方法,来获得其中的变量,方法,构造方法,修饰符,包等信息,这些信息就是用相应类的实例对象来表示,它们是Field、Method、Contructor、Package等等。
    一个类中的每个成员都可以用相应的反射API类的一个实例对象来表示,通过调用Class类的方法可以得到这些实例对象。


Constructor类:
    代表某个类中的一个构造方法。
*得到某个类所的的构造方法:
例子:
Constructor[] constructors=Class.getConstructors();
*得到某一个构造方法:
例子:Constructor constructor=
Class.forName("java.lang.String").getConstructor(StringBuffer.class);
//获得方法时要用到类类型
*创建实例对象:
通常方式:String str=new String(new StringBuffer("abc"));
反射方式:String str=(String)constructor.newInstance(new StringBuffer("abc"));//调用获得的方法时要用到上面相同类型的实例对象
*Class.newInstance()方法:
    例子:String obj=(String)Class.forName("java.lang.String").newInstance();
该方法内部先得到默认的构造方法,然后用该构造方法创建实例对象。
该方法内部的具体代码是怎样写的呢?用到了缓存机制来保存默认构造方法的实例对象。

反射会导至程序性能严重下降。

Field类
Field类代表某个类中的一个成员变量。

Methods类
Methods类代表某个类中的一个成员方法。
*得到类中的某一个方法:
例子:Methods charAt=
 Class.forName("java.lang.String").getMethod("charAt",int.class);
*调用方法:
     通常方式:System.out.println(str.charAt(1));
     反射方式:System.out.println(charAt.invoke(str,1));
*如果传递给Method对象的invoke()方法的第一个参数为null,这说明该Method对象对应的是一个静态方法!

数组的反射:
    具有相同维数和元素类型的数组属于同一个类型,即具有相同的Class实例对象。
    代表数组的Class实例对象的getSuperClass()方法返回的父类为Object类对应的Class。
    基本类型的一维数组可以被当作Object类型使用,不能当作Object[]类型使用;非基本类型的一维数组,既可以当做Object类型使用,又可以当做Object[]类型使用。


反射的作用->实现框架功能
*框架与框架要解决的核心问题
    我做房子卖给用户住,由用户自己安装门窗和空调,我做的房子就是框架,用户需要使用我的框架,把门窗插入进我提供的框架中。框架与工具类有区别,工具类被用户的调用,而框架则是调用用户提供的类。   
*框架要解决的核心问题
    我在写框架(房子)时,用户的程序还没写,类也没法提供。我写的框架程序怎样能调用你以后写的类(门窗)呢?
    因为在写程序时无法知道要被调用的类名,所以,在程序中无法直接new某个类的实例对象,而要用反射方式来做。   

 

内省->了解JavaBean
    JavaBean是一种特殊的Java类,主要用于传递数据信息,这种Java类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。
    如果要在两个模块之间传递多个信息,可以将这些信息封装到一个JavaBean中,这种JavaBean的实例对象通常称之为值对象(Value Object,简称VO)。这些信息在类中私有字段来存储,如果读取或设置这些字段的值,刚需要通过一些相应方法来访问。
    JavaBean的属性是根据其中的setter和getter方法来确定的,而不是根据其中的成员变量。例如:方法名为setId,中文意思即为设置id,至于把它在到哪个变量上,不用管;去掉set前缀,剩余部分就是属性名,如果剩余部分的第二个字母是小写的,则把剩余部分的首字母改成小的。
总之,一个类被当作javaBean使用时,JavaBean的属性是根据方法名推断出来的,它根本看不到java类内部的成员变量。

JavaBean类中方法命名规则:
1.如果类的成员变量的名字是xxx,那么为了更改或获取成员变量的值,即更改或获取属性,在类中可以使用两个方法:
                   getXxx(),用来获取属性xxx;
                   setXxx(),用来修改属性xxx.
2.对于boolean类型的成员变量,即布尔逻辑类型的属性,允许使用“is”代替上面的“get”和“set”。
3.类中方法的访问属性都必须是public的。
4.类中如果有构造方法,那么这个构造方法也是public的并且是无参数的。

相关文章推荐

C#反射及元数据性能问题

  • 2013年07月27日 17:44
  • 296KB
  • 下载

java反射机制及性能优化问题

Java 语言的反射机制 在Java运行时环境中,对于任意一个类,可以知道这个类有哪些属性和方法。对于任意一个对象,可以调用它的任意一个方法。 这种动态获取类的信息以及动态调用对象的方法的功能...

关于As3反射的问题

  • 2011年10月18日 23:15
  • 38KB
  • 下载

效率问题,Linq查询/多线程/反射/装箱相关

从以前msn space上搬家过来 8/31/2008 2:17:42 AM 在做ORM=>UI的框架时,对于查询,我没有直接绑定Linq返回的结果集,而是将他们转换为DataTable再绑到...
  • wjq
  • wjq
  • 2012年12月24日 01:35
  • 671

Java中通过反射调用其他类中的main方法时要注意的问题

一、正常情况下我们调用其他类的方法,如果是静态的,就直接:类名.方法 ;如果不是静态的:对象.方法;因为main为静态方法,所以调用它只需:类名.main(String...args)即可。   ...

反射、注解和线程、Thread、同步锁问题和基于多线程的Server通信(8.4)

反射查看api为class 抽象所有类共有的classfieldconstructmethod 反射的用途工厂设计模式 注解的用法 Thread 继承Thread方法 Runnable方法 Jion方...

关于反射中.getDeclaredContructor()返回构造方法顺序的问题

一、问题描述:     在下面这段示例练习过程中,当使用注释中的if...else if...else的代码时,在eclips中运行始终在 System.out.println("在创建对象时抛出异...

java动态加载指定的类或者jar包反射调用其方法-涉及其他jar中的类就报ClassNotFound问题分析及解决思路

在这篇博文中java动态加载指定的类或者jar包反射调用其方法,介绍动态加载指定的类,当时我是拿URLClassLoader介绍的,当然可以自定义一个ClassLoader重新对应的方法, 不过这个有...

【Android应用开发】-(21)Android中巧用反射解决程序兼容性问题

Android的更新速度太快,因为她的开源,所以造就了一批技术公司,一堆的方案,从而各有特色。对于一个想要深入了解系统的开发者来说这是幸运的,但从一个产品角度来看,这是致命的。我们开发应用程序,为了保...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:反射问题
举报原因:
原因补充:

(最多只允许输入30个字)