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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘丁 黑马帝   /  2012-2-14 17:44  /  2586 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 刘丁 于 2012-2-14 20:14 编辑

看到反射对Class这个类有点不解。。 求详解、

4 个回复

倒序浏览
获得Class对象的方法



u如果一个类的实例已经得到,你可以使用

       【Class c = 对象名.getClass(); 】

      例: TextField t = new TextField();

              Class c = t.getClass();

              Class s = c.getSuperclass();


u如果你在编译期知道类的名字,你可以使用如下的方法

Class c = java.awt.Button.class;
或者

         Class c = Integer.TYPE;


u如果类名在编译期不知道, 但是在运行期可以获得, 你可以使用下面的方法

          Class c = Class.forName(strg);

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

回复 使用道具 举报
一、反射Class 基本分析

反射的基石:  Class 字节码
//得到这个类的字节码的实例对象3种
类名.class  如,System.class;
对象.class   如p1.getClass();
Class.for("java.lang.String");   //返回字节码

有9个预定义的Class实例对象
8个基本类型对应的,加1个void
基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也表示为 Class 对象

。 Class cls1 = void.class;

[java] view plaincopyprint?
package ZHANG.Reflect;  
  
public class TestReflect {  
  
    public static void main(String[] args) throws Exception {  
        String str1 = "abc";  
        Class cls1 = str1.getClass();  
        Class cls2 = String.class;  
        Class cls3 = Class.forName("java.lang.String");  
        System.out.println(cls1 == cls2);  
        System.out.println(cls2 == cls3);  
         
        System.out.println(cls1.isPrimitive());//是否是一个基本类型的字节码 //flase   
        System.out.println(int.class.isPrimitive()); //true   
        System.out.println(int.class == Integer.class);  //false   
        System.out.println(int.class == Integer.TYPE); //基本类型可以写成这样 true   
        System.out.println(int[].class.isPrimitive()); //false   
        System.out.println(int[].class.isArray());  //数组的Class实例对象 true   
    }  
  
}  
package ZHANG.Reflect;

public class TestReflect {

        public static void main(String[] args) throws Exception {
                String str1 = "abc";
                Class cls1 = str1.getClass();
                Class cls2 = String.class;
                Class cls3 = Class.forName("java.lang.String");
                System.out.println(cls1 == cls2);
                System.out.println(cls2 == cls3);
               
                System.out.println(cls1.isPrimitive());//是否是一个基本类型的字节码 //flase
                System.out.println(int.class.isPrimitive()); //true
                System.out.println(int.class == Integer.class);  //false
                System.out.println(int.class == Integer.TYPE); //基本类型可以写成这样 true
                System.out.println(int[].class.isPrimitive()); //false
                System.out.println(int[].class.isArray());  //数组的Class实例对象 true
        }

}


评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

回复 使用道具 举报
Java程序中的各个Java类属于同一类事物,描述这类事物的Java类名就是Class(即:字节码)。
Class类描述了类的名字、类的访问属性、类所属的包名,字段名称列表,方法名称列表等。

字节码:即类被编译后,产生的.class文件被加载到内存后的内容。
一个类被类加载器加载到内存中,占用一片存储空间,这个空间里面的内容就是类的字节码,不同的类的字节码是不同的,所以他们在内存中的内容也是不同的。这一个个的空间可分别用一个个的对象来表示,这些对象显然具有相同的类型,这个类型就是Class类。

得到每个Class对应的实例对象的方法有3种:
1. 类名.class,例如:Date.class
2. 对象.getClass(),例如:New Date().getClass()
3. Class.forName("类名"),例如:Class.forName("java.util.Date")

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
本帖最后由 李杨 于 2012-2-14 22:57 编辑

就是说你加载class文件到内存中成为可用的字节码文件时,就得到了你家在的类的字节码,拿到字节码当然了里面的所有方法,还有字段都有可以使用.即便private也可以使用或者修改.不过需要注意的是.private修饰的你需要用声明方法或者用声明字段的相应的反射方法来获取.

即getDeclaredMethod和getDeclaredField,当然了要记得显示的拿到private.

即accessible需要设置可访问性.true和false。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马