A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© zdf091119 中级黑马   /  2012-10-28 19:43  /  1906 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

什么是反射,怎么用反射构建构造方法和实例对象,求大侠指导

评分

参与人数 1黑马币 +6 收起 理由
韩军博 + 6

查看全部评分

5 个回复

倒序浏览
这个你看一下张孝祥老师的高新技术第一天就全明白了,我把我的笔记让你看看吧
反射的三种方式:
类名.class
对象.getClass();
Class.forName("类的全称");

forname有两个作用,一种是虚拟机里面已经要要获取的类的字节码了
一种是还没有,加载进去再获取

有九个预定义的class对象,八个基本数据类型+void

isPrimitive()方法,判断字节码是否是基本数据类型
int.class.isPrimitice();true
int.class==Integer.class;false
int.class==Integer.TYPE;true
int[].class.isPrimitice();false
int[].class.isArray();true

***********************************
Constructor类代表某个类中的一个构造方法
获取某个java类的所有构造方法
Constructor cons[]=Class.forName("java.lang.String").getConstructors();
        for(Constructor c:cons){
                System.out.println(c);
        }

得到某一个构造方法:
Constructor constructor=Class.forName("java.lang.String").getConstructor(StringBuffer.class);

反射方式: String str = (String)constructor.newInstance(new StringBuffer("abc"));

Class类也提供了一个newInstance的方法
该方法是内部先得到默认的构造方法,然后用构造方法创建实例对象
String obj =(String)Class.forName("java.lang.String").newInstance();

评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1 很给力!

查看全部评分

回复 使用道具 举报
反射就是在运行状态中,对于任意一个类,都能够得到它的所有属性和方法;
对于任意一个对象,都能够用反射调用它的任意一个构造方法;
利用反射可以动态获取类的信息以及动态调用对象的方法;
下面代码是用反射获得类的构造方法和创建实例对象:
Constructor con;
try {
   con = String.class.getConstructor(StringBuffer.class); //这句代码是通过类的字节码来获得指定的构造函数
   String str = (String) con.newInstance(new StringBuffer("abc")); //通过构造函数来实例对象
   System.out.println(str);
} catch (Exception e) {
   e.printStackTrace();
}
这样就完成了反射一个类,需要注意的是:实例不同的构造函数需要传入不同的参数来对应。这是我的理解。

评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1 很给力!

查看全部评分

回复 使用道具 举报
所谓的反射就是,把一类中的字段(变量)、方法、构造函数等,给它取出来再放到一个个类中
举个例子:
public class Animal
{
    //字段
   private String name;
   private String address;
   private int age;
   private int id;
   private boolean sex;
   ........
   //构造函数
   Animal(int age,String name,boolean sex){//具体实现省略}
   Animal(int age,int id,boolean sex){//具体实现省略}
   Animal(int age,String address,boolean sex){//具体实现省略}
   Animal(int age,String name,int id){//具体实现省略}
   .................
   //方法
   public void method1(int x,int y){//具体实现省略}
   public int  method1(String a,int b){//具体实现省略}
   public String method1(boolean zz,String vv){//具体实现省略}
   public boolean method1(){//具体实现省略}
   public double method1(int www){//具体实现省略}
   ..........
}
上面这个类有很多方法吧,嗯!是的
那么可以用Concustor 这个类表示Animal这个类中的所有构造函数吧,嗯!是的
那么可以用Method这个类表示Animal这个类中的所有普通方法吧,嗯!是的
那么可以用Field这个类表示Animal这个类中的所有字段吧,嗯!是的
那么可以用................这个类表示Animal这个类中的所有..............吧,嗯!是的

就是说把一个类中的共有属性抽出来,再放到一个类中!

嗯,就讲这么多,还有其他的,理解反射必须先了解Class这个类,还有字节码啥的,时间的原因,明天给你补上

评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1 很给力!

查看全部评分

回复 使用道具 举报
反射通俗的就是说通过某一个类的字节码得到其类的成员和描述的java类 不知道说的准确不准确 呵呵
拿到字节码有三种方法:
1.类名.class
2.对象名.getClass();
3.Class.forName(类的全名包括包的名称);   例如得到String的字节码  
第一种方法:Class className  = String.class;
第二种方法:
String str = "abc";
Class className = str.getClass();
第三种方法:Class className  = Class.forName("java.lang.String");

得到字节码后就可以得到该类的构造方法了,还是以String为例:例如得到String中的public String(String original)的构造方法:

Constructot constructor = className.getConstructor(String.class);  //得到String的参数为String的构造函数  因为要得到的参数为String类型,所以这里写String.class

String str = (String)constructor.newInstance("abcdef");   //用String的参数为String的构造构造函数创建String的实例对象
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
也可以得到 String中的 public String(int[] codePoints,int offset,int count)
Constructot constructor = className.getConstructor(int[].class,int.class,int.class);  //参数为什么类型在后面加上.class就行了  
int[] array = new int[]{1,2,34,5};
String str = (String)constructor.newInstance(array,0,2);   //传入的参数类型跟构造函数相对应


java基础加强里讲的很清楚了,你可以从第十七个视频开始看。里面还有获取属性信息和获取函数的方法。

评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1 很给力!

查看全部评分

回复 使用道具 举报
本帖最后由 王得新 于 2012-10-29 19:12 编辑

接着补充昨天没说完的:

最后说了,要先理解字节码和Class这个类,嗯!是的

字节码:
用eclipse等软件编写的.java文件叫源文件,一点击保存(其实就调用了javac.exe)eclipse就编译了.java文件------>生成.class文件
当你运行的时候是这样的(java.exe----->JVM------>将.class文件翻译成字节码文件,这时候一个.class文件的字节码就加载到了计算机的内存中了)
图解一下
Class类:

人(Person)是一个类吧,嗯!是的
汽车(Car)是一个类吧,嗯!是的
植物(Plant)是一个类吧,嗯!是的
............................
那么人、汽车、植物.............是不是也是也可以归为一个类来管理呢,嗯!可以
这个类就是Class类
接着人啊、汽车啊、植物啊.............每个类中里面是不是有字段、构造方法、普通方法.....................那么他们是不是也可以归为一个类呢,嗯!可以
Field-------->对应每个类的字段
Constructor------>对应每个类中的构造函数
Method------>对应每个类的普通方法
xxx-------->对应每个类的xxx

怎么把一个类中的字段、构造函数、方法抽取出来放到Field、Constructor、Method里面呢?
这就用到了反射了!!!!嗯!!!
每个.class文件(Person.class)加载到JVM的时候在内存中都有一个字节码文件:(给它取个名字,是Class的引用)
Class  person=Person.class(这里获得字节码有三种方式,其他黑马都回答了就不多说了)
这时就可以用person这个对象调用Class这个类中的方法了
什么person..getConstructor()------->存到Constructor这个类中
什么person.getField();--------->存到Field这个类中
什么person.getMethod()--------->存到Method这个类中

说的有不懂的,再回复,我再回复,嗯!好的





图1.png (14.02 KB, 下载次数: 30)

图1

图1

图2.png (10.37 KB, 下载次数: 29)

图2.png
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马