Java反射举例

本文参考:http://www.cnblogs.com/yydcdut/p/3845430.html

1.Java反射的基本介绍

Java的反射非常强大,传递class, 可以动态的生成该类、取得这个类的所有信息,包括里面的属性、方法以及构造函数等,甚至可以取得其父类或父接口里面的内容。

Java 反射机制主要提供了以下功能:

  • 在运行时判断任意一个对象所属的类;
  • 在运行时构造任意一个类的对象;
  • 在运行时判断任意一个类所具有的成员变量和方法;
  • 在运行时调用任意一个对象的方法;
  • 生成动态代理。

在 JDK 中,主要由以下类来实现Java 反射机制,这些类都位于java.lang.reflect包中。

  • Class类:代表一个类。
  • Field类:代表类的成员变量(成员变量也称为类的属性)。
  • Method类:代表类的方法。
  • Constructor 类:代表类的构造方法。
  • Array类:提供了动态创建数组,以及访问数组元素的静态方法。
package com.hh.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

public class ClassDemo {

	public static void main(String[] args) throws Exception {
		//11111
		System.out.println("========11111==========");
		Person person1 = new Person();
		Class c1 = person1.getClass();

		Person person2 = new Person();
		Class c2 = person2.getClass();

		System.out.println(c1 == c2);

		//22222
		System.out.println("========22222==========");
		Class c3 = Person.class;
		System.out.println(c1 == c3);

		//33333
		System.out.println("========33333==========");
		Class c4 = Class.forName("com.hh.reflect.Person");
		System.out.println(c1 == c4);
		Constructor co = c4.getConstructor(null);
		Object obj = co.newInstance(null);
		Method m = c4.getMethod("show", null);
		m.invoke(obj, null);
	}

}

Person类:

package com.hh.reflect;

public class Person {
	public void show(){
		System.out.println("Person------->show()");
	}
}

运行结果:

========11111==========
true
========22222==========
true
========33333==========
true
Person------->show()

因为项目中只有一个person.class文件,所以以反射获取的到对象都是一样的。

2.反射的用法之一

假设有两个类:1.ClassA.java   2.ClassB.java

public class ClassA {
	public void show(String str){
		System.out.println(str +" ClassA------>show()");
	}
}
public class ClassB {
	public void show(String str){
		System.out.println(str + " ClassB------>show()");
	}
}

再加一个配置文件who.txt,内容如下:

class=com.hh.reflect.ClassB
method=show

主类ReflectTest.java是这样的

public class ReflectTest {

	public static void main(String[] args) throws Exception {
		Properties prop = new Properties();
		FileReader fr = new FileReader("who.txt");
		prop.load(fr);
		fr.close();

		String className = prop.getProperty("class");
		String methodName = prop.getProperty("method");
		//获得对象的类型
		Class c = Class.forName(className);
		//通过默认构造方法创建一个新的对象
		Constructor co = c.getConstructor(null);
		Object obj = co.newInstance(null);
		//获得对象的方法
		Method m = c.getMethod(methodName, "Hello".getClass());
		//调用对象的方法
		m.invoke(obj, "Hello");
	}

}

当修改配置文件,使得class的属性为不同的值的时候,程序运行结果是不一样的:

① class=com.hh.reflect.ClassA

Hello ClassA------>show()

② class=com.hh.reflect.ClassB

Hello ClassB------>show()

其中"Hello"是传给show(String str)方法的参数

上面这个反射的小例子的原理,被Java框架,如Hibernate、Spring等常用:先用XML解析配置文件,再通过Java反射机制获取类的所有信息。

Java反射举例,布布扣,bubuko.com

时间: 2024-10-26 17:15:48

Java反射举例的相关文章

Java反射

1. 介绍 反射是一种能够在程序运行时动态访问.修改某个类中任意属性和方法的机制. 具体:对于任意一个类,都能够知道这个类的所有属性和方法对于任意一个对象,都能够调用它的任意一个方法和属性 在运行时,当加载完类之后,JVM在堆内存中会自动产生一个Class类型的对象,这个对象包含了完整的类的结构信息 这个Class对象就像一面镜子,透过这个镜子看到类的结构 那么,如何得到这个Class对象呢?以下可否 Class c = new Class(); 答案是不行的,因为Class的构造函数定义为私有

Java反射机制剖析(三)-简单谈谈动态代理

通过Java反射机制剖析(一)和Java反射机制剖析(二)的学习,已经对反射有了一定的了解,这一篇通过动态代理的例子来进一步学习反射机制. 1.     代理模式 代理模式就是为其他对象提供一种代理来控制对这个对象的访问.其实代理模式是在访问的对象时引入一定程度的间接性,这种间接性可以附加多种用途. 它 的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会 存在关联关系,一个代理类的对象与一个委托类的对象

java反射与动态代理的理解

一.什么是反射机制? 反射的官方定义是这样的:在运行状态中,对于任意的一个类,都能够知道这个类的所有属性和方法,对任意一个对象都能够通过反射机制调用一个类的任意方法,这种动态获取类信息及动态调用类对象方法的功能称为java的反射机制. 讲的通俗一点的话就是,对于jvm来说,.java文件必须要先编译为.class文件才能够被jvm执行,所以在编译为.class文件的过程中,对象的类型都会被指定好,比如说 User user.那么如果说我想在代码运行的过程中获取到对象的类型呢?或者说程序在运行过程

08.Java反射问题

目录介绍 8.0.0.1 反射的原理是什么?有哪些途径获取到Class对象,Class类的含义和作用是什么?什么是class类? 8.0.0.2 有哪些方式可以提高反射效率?为何反射消耗性能?究竟是怎么影响的,举例说明? 8.0.0.3 java反射机制提供了什么功能?发射具有暴力访问权限,如何防止反射序列化***单例? 8.0.0.4 通过反射获得泛型的实际类型参数?反射获取构造方法,变量,方法的方法是哪些? 8.0.0.5 getGenericParameterTypes 与 getPara

简谈Java 反射机制,动态代理

谈谈 Java 反射机制,动态代理是基于什么原理?小编整理了一些java进阶学习资料和面试题,需要资料的请加JAVA高阶学习Q群:701136382 这是小编创建的java高阶学习交流群,加群一起交流学习深造.群里也有小编整理的2019年最新最全的java高阶学习资料! 反射机制 Java 语言提供的一种基础功能,赋予程序在运行时自省(introspect,官方用语)的能力.可以在运行时通过提供完整的"包名+类名.class"得到某个对象的类型. 功能 在运行时能判断任意一个对象所属的

如何防止JAVA反射对单例类的攻击?

加静态标志位,构造方法通过synchronized修饰.或者枚举 举例1:不经过处理的单例类被JAVA反射机制攻击 Singleton.java    代码清单[1.1] 1 public class Singleton 2 { 3 private static boolean flag = true; 4 private static final Singleton INSTANCE = new Singleton(); 5 6 private Singleton() 7 { 8 } 9 10

Java反射理解(五)-- 方法反射的基本操作

Java反射理解(五)-- 方法反射的基本操作 方法的反射 1. 如何获取某个方法 方法的名称和方法的参数列表才能唯一决定某个方法 2. 方法反射的操作 method.invoke(对象,参数列表) 举例 具体操作请看下面举例: import java.lang.reflect.Method; class A{ public void print(){ System.out.println("helloworld"); } public void print(int a,int b){

Java反射理解(四)-- 获取成员变量构造函数信息

Java反射理解(四)-- 获取成员变量构造函数信息 步骤 获取成员变量信息: obj.getClass() 获取类类型对象 成员变量也是对象,java.lang.reflect.Field 类中封装了关于成员变量的操作: getFields() 方法获取的是所有的public的成员变量的信息 getDeclaredFields() 获取的是该类自己声明的成员变量的信息 getType() 得到成员变量的类型的类类型 getName() 得到成员变量的名称 获取成员变量构造函数信息: obj.g

Java 反射理解(三)-- Java获取方法信息

Java 反射理解(三)-- Java获取方法信息 基本的数据类型.void关键字,都存在类类型. 举例如下: public class ClassDemo2 { public static void main(String[] args) { Class c1 = int.class;//int 的类类型 Class c2 = String.class;//String类的类类型,可以理解为String类字节码 Class c3 = double.class; Class c4 = Doubl