`

j2se----反射

    博客分类:
  • J2SE
阅读更多

为什么要有反射。。。?
答:可以根据别人给我的一个字符串动态的调用它指定的类。。。。

反射的基石是----Class这个类
因为他是所有.class文件的抽象,而Class的实例就代表内存中的一段字节码或者理解为某一个具体的.class文件

如何得到字节码的实例对象:
Class.forName("java.lang.String");//先到内存中去找字节码,如果找到就直接返回,如果没有则用内加载器去加载,然后再去内存中拿
Date.class或new Date().getClass()或Class.forName("java.util.Date")都额可以得到这个字节码而且是同一个,注意第三个最灵活

反射就是:把某个java类中的每一个成分解析都成为一个java类,如Method类,Field类。。。。

1。Constructor cons = String.class.getConstructor(StringBuffer.class);
String s = (String)cons.newInstance(new StringBuffer("aaa"));

想要new 一个东西,那么得到它的构造器就可以new....

2。Field代表一个类上的成员变量,而不是一个对象上的成员变量。。。

AA aa = new AA(3,5);
Field fieldY = aa.getClass().getField("y");  //注意,这个fieldY还只是类上的哦。。。而且这个Field不是所有的Field,而是允许访问的而已
fieldY.get(aa);//这是得到aa对象上的FieldY变量,这时这个y不能是私有的哈。。。

如何得到私有的实例变量呢?
AA aa = new AA(3,5);
Field fieldX = aa.getClass().getDeclaredField("x"); //这时就可以看到所有的申明的实例变量了,但还拿不到
fieldX.setAccessible(true);//这行代码被称作暴力反射,虽然私有的不让拿,那么我就抢
fieldX.get("aa");//这时就可以拿到私有的域值了

3。Method代表一个类上的方法。。。
String str1 = "abc";
Method charAtMethod = String.class.getMethod("charAt",int.class);//意思是得到参数是int的charAt方法
charAtMethod.invoke(str1,1); //调用str1上的这个方法,参数是1
charAtMethod.invoke(null,1);//调用静态的这个方法,参数是1

4。数组的反射,有点区别的是数组的反射要借助数组的静态反射类

private static void printObject(Object obj){
		Class clazz = obj.getClass();
		if(clazz.isArray()){
			int len = java.lang.reflect.Array.getLength(obj);
			for(int i=0;i<len;i++){
				System.out.println(Array.get(obj, i));
			}
		}else{
			System.out.println(obj);
		}
	}


5。 用反射穿透泛型。。。因为泛型是给编译器看的,编译器看完之后会擦除泛型
List<String> list = new ArrayList<String>();
//list.add(1);---不能这么搞,因为编译器会说  哥们,你写错了

list.getClass().getMethod("add", Object.class).invoke(list, 1);
这样就穿透泛型了。。。

6。我传给你一个对象 obj,我可以通过反射知道这个obj里面到底有些什么东西,但是我得不到obj自己是个什么东西。。。。怎么办?

答案是没办法,但是如果一个 List<Date> a = new ArrayList<Date>();
如果我想知道这个List里面是什么类型则可以办到

思路是,先定义一些方法,然后把这个obj传到哪个方法里面去,看他匹配哪个方法就知道了。。。
Method m = DaoUtil.class.getMethod("myType", List.class);
        Type[]	types =	  m.getGenericParameterTypes();
        ParameterizedType type = (ParameterizedType)types[0];
        System.out.println(type.getActualTypeArguments());//这个是得到哪个Date
        System.out.println(type.getRawType());//这个是得到java.util.List


7。 Class c1 = "abc".getClass();
    Class c2 = "aaa".getClass();
System.out.println(c1 == c2);

打印出来的是true ; 因为虽然"abc"和"aaa"的实例是不一样的,但是他们都是String类,那么加载到内存的字节码是一样的。。。





分享到:
评论

相关推荐

    J2SE6.0-API(中文)-冷冻大雪.chm和java api1.6中文文档.chm

    J2SE(Java Standard Edition)6.0版本是Java平台的一个重要里程碑,为开发者带来了许多新特性、增强和优化。这个压缩包包含三个重要的资源:《J2SE6.0-API(中文)-冷冻大雪.chm》、《java api1.6中文文档.chm》...

    J2SE的反射机制高级应用

    J2SE的反射机制高级应用J2SE的反射机制高级应用J2SE的反射机制高级应用J2SE的反射机制高级应用

    j2se练习代码 Java学习资料

    9. **反射机制**:了解如何在运行时动态地获取类的信息并操作类的对象。 10. **泛型**:学习如何使用泛型来提高代码的类型安全性和重用性。 11. **枚举和注解**:理解枚举类型及其在程序中的应用,以及注解的作用...

    J2SE技术总结-Java学习精华教程-电子书

    本书内容非常全面,涵盖了《Java编程思想》、《Java学习笔记》等书籍所有知识要点,并结合作者自己经验总结而编写,内容丰富程度胜过...反射 ..........概述 ..........Class类 ..........类的加载 ..........操作对象

    Java-J2SE学习笔记

    8. **反射机制**: - **Class类**:用于获取类的信息,如构造函数、方法、字段等。 - **动态代理**:在运行时创建代理类,实现接口的方法调用。 9. **枚举类型**: - 枚举是Java中的一种特殊类,用于表示固定...

    java-j2se.rar_j2se

    9. **反射机制**:Class类的使用,动态加载类、创建对象、获取类信息(如字段、方法、构造器)等。 10. **Java集合框架**:List、Set、Map接口的实现类及其特点,以及Collections工具类的使用。 11. **泛型**:...

    J2SE基础知识大全

    Java 2 Platform, Standard Edition(J2SE)是Java平台的核心组成部分,主要用于桌面应用程序的开发。J2SE基础知识是每一个Java开发者必须掌握的核心技能。以下将详细阐述J2SE中的关键概念和技术。 1. **Java语言...

    J2ME-J2EE-J2SE

    它包含了Java语言的基本特性和类库,如集合框架、I/O流、网络编程、多线程、反射等。J2SE是J2ME和J2EE的基础,也是开发Java桌面应用的标准平台。随着版本迭代,如Java SE 8、9、11等,引入了更多的新特性,如Lambda...

    J2SE常见面试题

    Java标准版(J2SE,Java 2 Platform Standard Edition)是Java开发平台的核心部分,用于构建和运行桌面应用。在面试中,对于J2SE的掌握程度常常是评估候选人技术能力的重要指标。以下是一些J2SE面试中常见的知识点:...

    J2SE基础源代码

    9. **反射与注解**:Java的反射机制允许程序在运行时动态地获取类的信息并调用其方法。注解则提供了一种元数据的方式,可以在编译时或运行时处理代码。源代码中可能包含这两个特性的应用。 10. **泛型**:自Java 5...

    学习j2se的30个问题

    ### 学习J2SE的30个关键知识点解析 #### J2SE的特性与应用场景 J2SE(Java 2 Platform, Standard Edition)是Java技术标准版的一部分,主要用于开发桌面应用程序、网络应用以及简单的服务器端应用。它包含了运行...

    j2se_中文版

    在Java编程中,J2SE是基础,它包含了核心类库,如集合框架、I/O流、网络编程、多线程、GUI(图形用户界面)组件、异常处理、反射机制等。这些API为开发者提供了构建复杂应用程序所需的各种工具和功能。 1. 集合框架...

    张孝祥J2SE加强自学笔记(48-56)

    【张孝祥J2SE加强自学笔记(48-56)】主要涵盖了类加载器、代理类和动态类创建等Java核心知识点。 48、类加载器的问题实验分析: 在Java中,类加载器是负责查找并加载类的机制。在Web应用中,有多种类加载器,如...

    J2SE宏观性总结

    Java 2 Platform, Standard Edition(简称J2SE)是Java平台的核心部分,它为开发桌面应用、服务器端应用以及中间件提供了基础。J2SE包含了Java语言的核心库,包括类库、开发工具和运行环境,使得开发者能够创建、...

    j2se中文6.0api

    6. **反射机制**:Java的反射API允许在运行时检查和操作类、接口、字段和方法,增强了程序的动态性。 7. **国际化与本地化**:`java.util.Locale`和`ResourceBundle`支持应用程序的国际化,可以根据用户的地区提供...

    j2se doc 中文版

    3. **类库详解**:J2SE 包含了大量的内置类库,如集合框架、I/O 流、反射、正则表达式、日期时间处理等。通过文档,开发者可以学习如何利用这些类库来实现特定功能,提高代码的复用性和可维护性。 4. **标准版特性*...

    j2se全部学习代码

    7. **反射机制**:允许程序在运行时检查和操作类、接口、字段和方法,增加了代码的灵活性。 8. **枚举**:Java中的枚举类型是一种特殊的类,用于定义一组固定的值,通常用于表示有限的、预定义的选项。 9. **泛型*...

    J2SE学习代码

    Java标准版(J2SE,Java 2 Platform Standard Edition)是Java开发平台的一个核心组件,主要面向桌面应用和服务器端应用程序开发。它包含了Java运行环境、基础类库以及开发工具,是Java程序员进行编程的基础。在J2SE...

    J2SE资料

    5. **反射**:通过Class对象动态访问类的信息,创建并操作类的对象。 6. **枚举与注解**:枚举类型的使用和注解(Annotation)在元编程中的应用。 7. **JNI(Java Native Interface)**:Java与本地代码(C/C++)...

Global site tag (gtag.js) - Google Analytics