Java中的反射——(1)什么是反射

Java程序中的各个Java类属于同一类事物,描述这类事物的Java类名就是Class.

public class ReflectTest {
	public static void main(String[] args) throws ClassNotFoundException {
		String str1 = "abc";
		Class cls1 = String.class;
		Class cls2 = str1.getClass();
		Class cls3 = Class.forName("java.lang.String");

		System.out.println(cls1 == cls2);
		System.out.println(cls2 == cls3);
	}
}

获取Class类的实例方法有三种:

1、类名.class

2、对象.getClass()

3、Class.forName("String path);

上面例子中两个返回都是true,我们可以看到三种方式获取到的Class类的实例是相同的,每一个类型就是一个Class类的实例对象。

下面我们再来看看Class类的isPrimitive()方法:

public class ReflectTest {
	public static void main(String[] args) throws ClassNotFoundException {
		String str1 = "abc";
		Class cls1 = String.class;
		Class cls2 = str1.getClass();
		Class cls3 = Class.forName("java.lang.String");

		System.out.println(cls1 == cls2);
		System.out.println(cls2 == cls3);

		System.out.println(cls1.isPrimitive());
		System.out.println(int.class.isPrimitive());
		System.out.println(int.class == Integer.class);
		System.out.println(int.class == Integer.TYPE);
	}
}

运行结果:

从上面结果可以看到,Integer类型的字节码和int类型的字节码不是同一个,在Java中有九种预定义的 Class 对象,表示八个基本类型和 void。这些类对象由 Java 虚拟机创建,与其表示的基本类型同名,即 booleanbytecharshortintlongfloatdouble

除过Integer.TYPE外,还有:Boolean.TYPE, Character.TYPE, Byte.TYPE, Short.TYPE, Integer.TYPE, Long.TYPE, Float.TYPE, Double.TYPE, Void.TYPE

只要在源程序中出现的类型,都有各自的Class实例对象,判断的方法如下:

反射就是把Java类中的各种成分映射成相应的Java类。例如,一个Java类用一个Class类的对象来表示,一个类中的组成部分:成员变量,方法,构造方法,包等等信息也用一个个的Java类来表示,就像汽车是一个类,汽车中的发动机,变速箱也是一个个的类。表示Java类的Class类中提供了一系列的方法来获取其中的变量(Field),方法(Method),构造方法(Contructor),修饰符,包(Package)等信息。

Java中的反射——(1)什么是反射,布布扣,bubuko.com

时间: 2024-12-28 18:45:49

Java中的反射——(1)什么是反射的相关文章

Java中会有内存泄露吗?

一.Java内存回收机制 不论哪种语言的内存分配方式,都需要返回所分配内存的真实地址,也就是返回一个指针到内存块的首地址.Java中对象是采用new或者反射的方法创建的, 这些对象的创建都是在堆(Heap)中分配的,所有对象的回收都是由Java虚拟机通过垃圾回收机制完成的.GC为了能够正确释放对象,会监控每个对象的 运行状况,对他们的申请.引用.被引用.赋值等状况进行监控,Java会使用有向图的方法进行管理内存,实时监控对象是否可以达到,如果不可到达,则就将 其回收,这样也可以消除引用循环的问题

Java中关于内存泄漏出现的原因以及如何避免内存泄漏(超详细版)

Android 内存泄漏总结 内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题.内存泄漏大家都不陌生了,简单粗俗的讲,就是该被释放的对象没有释放,一直被某个或某些实例所持有却不再被使用导致 GC 不能回收.最近自己阅读了大量相关的文档资料,打算做个 总结 沉淀下来跟大家一起分享和学习,也给自己一个警示,以后 coding 时怎么避免这些情况,提高应用的体验和质量. 我会从 java 内存泄漏的基础知识开始,并通过具体例子来说明 Android 引起内存泄漏的各种原因,以

java中的反射机制和javaBean

反射 反射:就是通过一个类加载进方法区时加载到栈内存中的Class字节码文件对这个类进行解剖 通过反射可以获取到一个类的构造方法,成员方法,成员变量 反射将一个类的各个部分映射成相应的类 反射获取构造方法 Class类中方法 Constructor<?>[] getConstructors() 返回当前字节码文件对象的所有public修饰的构造方法 Constructor<T> getConstructor(Class<?>...parameterTypes)返回指定了

java中的反射

一.什么是反射 简单来说,java反射机制其实就是I/O流的一种封装版,用来快速读取硬盘上的class文件.class文件相当于一个身份证,JVM在操作某一个对象时,需要根据身份证获得对象拥有的属性和拥有的功能及方法.这种动态获取的信息以及动态调用对象方法的功能称为java语言的反射机制. 二.官方提供的反射机制API: class文件: java.lang.reflect.Class类:描述内存中class文件 属性(数据存储单位): java.lang.reflect.Field类:描述内存

Java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别(转)

一.Java的反射机制   每个Java程序执行前都必须经过编译.加载.连接.和初始化这几个阶段,后三个阶段如下图:  其中 i.加载是指将编译后的java类文件(也就是.class文件)中的二进制数据读入内存,并将其放在运行时数据区的方法区内,然后再堆区创建一个Java.lang.Class对象,用来封装类在方法区的数据结构.即加载后最终得到的是Class对象,并且更加值得注意的是:该Java.lang.Class对象是单实例的,无论这个类创建了多少个对象,他的Class对象时唯一的!!!!.

Java 中反射机制的深入研究

昨天学习了java的反射机制,今天继续深入学习一下. 一.通过反射操作数组 反射不光只能用在类中,也可用在任意的引用数据类型上.当然包括数组. 通过java.lang.reflect.Array 类 可操作数组,java.lang.reflect.Array 类 下面提供了很多方法. 例如 public static Object get(Object array,int index)throws IllegalArgumentException,ArrayIndexOutOfBoundsExc

java中反射学习整理

转载请注明:http://blog.csdn.net/j903829182/article/details/38405735 反射主要是指程序可以访问,检测和修改它本身的状态或行为的一种能力. java中反射是一种强大的工具,它能够创建灵活的代码,这些代码可以在运行时装载,无须在组件之间进行链接.反射允许在编写与执行时,使程序能够接入到jvm中的类的内部信息,而不是源代码中选定的类协作的代码.这使反射成为构建灵活应用代码的主要工具.需要注意的是,如果使用不当,反射的成本会很高. package

java中利用反射机制绕开编译器对泛型的类型限制

首先看下面这个例子 public static void main(String[] args) { ArrayList<Integer> al1 = new ArrayList<Integer>(); al1.add(1); ArrayList<String> al2 = new ArrayList<String>(); al2.add("hello"); //int型链表和string型链表,结果为true System.out.pr

Java中的反射总结

反射是获取运行时类信息,即常量区中的Class信息. 要获取类信息,必然需要依据,不然系统怎么指定你要获取那个类信息, 类信息在java中就是Class类的一个对象,它是一个java类抽象,换句话说它代表了一个'类'(类本身是一种事物的抽象,在程序中它代表了这一事物,Class就是对这种类的一种抽象), 三种获取方式, 1).Class名称的字符串  Class.forName 2).根据Class获取, Integer.class 3).根据对象获取  (new Integer()).getC