Java反射机制与应用

    JAVA反射机制

    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

    JAVA反射应用

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

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

常用方法

①. 判断对象是否属于反射得到的类(isInstance)

class S {
}
public class IsInstance {
   public static void main(String args[]) {
      try {
           Class cls = Class.forName("S");
           boolean b1 = cls.isInstance(new Integer(37));
           System.out.println(b1);
           boolean b2 = cls.isInstance(new S());
           System.out.println(b2);
      }
      catch (Throwable e) {
           System.err.println(e);
      }
   }
}

在这个例子中创建了一个S 类的 Class 对象,然后检查一些对象是否是S的实例。结果输出false和true。说明Integer(37) 不是,但 new S()是。

②. 获取某个反射类的所有属性字段

	/**
	 * 获取反射类的所有属性字段
	 *
	 * @param ownerClass 反射的类
	 * @return
	 * @throws Exception
	 */
	public Field[] getProperty(Class ownerClass) throws Exception {

		//获取该类所有属性字段
	    //Field[] fields = ownerClass.getFields();//只获取public访问权限的属性字段(包括父类的)
	    Field[] fields = ownerClass.getDeclaredFields();//只获取该类的所有访问权限的属性(不含父类)

	    //输出所有属性字段
	    for(int i=0;i<fields.length;i++){
	    	System.out.println("属性:"+fields[i]);
	    }

	    return fields;
	}

③. 获取反射类的某个public属性值

	/**
	 * 获取反射类的某个public属性值
	 *
	 * @param ownerClass 反射的类
	 * @param fieldName 属性名
	 * @return
	 * @throws Exception
	 */
	public Object getProperty(Object owner,String fieldName) throws Exception {

		//得到对象所属类
		Class ownerClass = owner.getClass();

		//获取该类的某个属性
	    Field field = ownerClass.getField(fieldName);

	    //获取某个对象的特定属性
	    Object property = field.get(owner);

	    //输出该属性信息
	    System.out.println(fieldName+"的属性值:"+property.toString());

	    return property;

	}

④.获取反射类的该中的所有方法

	/**
	 * 获取反射类的该中的所有方法
	 * @param ownerClass 反射的类
	 * @return
	 * @throws Exception
	 */
	public Method[] getMethods(Class ownerClass) throws Exception {

		//获取该类所有方法
	    //Field[] fields = ownerClass.getMethods();//只获取public访问权限的方法(包括父类的)
	    Method[] methods = ownerClass.getDeclaredMethods();//只获取该类的所有访问权限的方法(不含父类)

	    //输出所有方法
	    for(int i=0;i<methods.length;i++){
	    	System.out.println("方法:" +methods[i]);
	    }

	    return methods;
	}

⑤. 执行反射类的该中的某个方法

	/**
	 * 执行反射类的该中的某个方法
	 * @param ownerClass 反射的类
	 * @param methodName 方法名
	 * @return
	 * @throws Exception
	 */
	public Object invokeMethod(Object owner,String methodName,Object[] args) throws Exception {

		//得到对象所属类
		Class ownerClass = owner.getClass();

		//获取该类的某个方法
		Method method = ownerClass.getMethod(methodName, null);

	    //执行某个对象的方法
		Object result = method.invoke(owner, args);

	    //输出结果信息
	    System.out.println("结果返回值:"+ result);

	    return result;
	}

实例演示方法:

	/**
	 * 测试反射常用方法
	 */
	public void refTest(){
		String className = "com.java.reflecttest.Student";

		try {

			//通过反射机制,使用类装载器,装载该类
			Class<?> stu = Class.forName(className);
			Object objStu = stu.newInstance();

			//获取反射类的所有属性
			System.out.println("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
			System.out.println("调用 getProperty 方法,获取Student类的所有属性");
			getProperty(stu);

			//获取反射类的某个属性值
			System.out.println("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
			System.out.println("调用 getProperty 方法,获取Student类的NAME属性值");
			getProperty(objStu,"NAME");

			//获取反射类的所有方法
			System.out.println("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
			System.out.println("调用 getMethods 方法,获取Student类的所有方法");
			getMethods(stu);

			//执行反射类的getInfo方法
			System.out.println("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
			System.out.println("调用 invokeMethod 方法,执行Student类的getInfo方法");
			invokeMethod(objStu, "getInfo", null);

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

演示所用的Student类 

package com.java.reflecttest;

/**
 * 学生信息类
 *
 * @author Longxuan
 *
 */
public class Student {

	/**
	 * 学号
	 */
	private String stuId ;

	/**
	 * 学号
	 */
	public String STUID;

	/**
	 * 姓名
	 */
	private String name ;

	/**
	 * 姓名
	 */
	public String NAME;

	/**
	 * 年龄
	 */
	private int age;

	/**
	 * 年龄
	 */
	public int AGE;

	/**
	 * 班级
	 */
	private String classid;

	public String getStuId() {
		return stuId;
	}

	public void setStuId(String stuId) {
		this.stuId = stuId;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getClassid() {
		return classid;
	}

	public void setClassid(String classid) {
		this.classid = classid;
	}

	/**
	 * 输出学生信息
	 */
	public void getInfo(){
		System.out.println("学生信息:\n学号:"+stuId+"\t姓名:"+name+"\t年龄:"+age+"\t班级:"+classid);
	}

	/**
	 * 构造函数
	 */
	public Student(){
		init();
	}

	/**
	 * 私有初始化方法
	 */
	private void init(){
		this.name = "张三";
		this.stuId ="1001";
		this.age = 14;
		this.classid = "A001";
		this.NAME = name;
		this.AGE = age;
		this.STUID = stuId;
	}

}

运行结果:

时间: 2024-09-22 10:33:45

Java反射机制与应用的相关文章

Java反射机制:包括组成、结构和示例说明等内容

第1部分 Java 反射机制介绍 Java 反射机制.通俗来讲呢,就是在运行状态中,我们可以根据"类的部分已经的信息"来还原"类的全部的信息".这里"类的部分已经的信息",可以是"类名"或"类的对象"等信息."类的全部信息"就是指"类的属性,方法,继承关系和Annotation注解"等内容. 举个简单的例子:假设对于类ReflectionTest.java,我们知道的

java反射机制系列(二)例子

下面我以顾客买相机为例来说明Java反射机制的应用.例子中涉及的类和接口有: Camera接口:定义了takePhoto()方法. Camera01类:一种照相机的类型,实现Camera接口. Camera02类:另一种照相机的类型,实现Camera接口. Seller类:卖照相机. Customer类:买相机,有main方法. 所有类都放在com包里 程序如下: public interface Camera { //声明照相机必须可以拍照 public void takePhoto(); }

java 反射机制系列(一) 初识Java Reflection

Java 反射机制是指Java程序可以在执行期载入,探知,使用编译期间完全未知的classes.这句话可能有点难以理解,我们可以通过一个例子来看.在Java程序中我们经常会用到这样一条语句来创建一个对象.Date date = new Date();在这条语句中date的类型(Java.util.Date)在编译时 已经确定.那么,有没有办法使我们把对象类型的确定时间由编译转到运行,答案是肯定的.这就是Java反射机制所提供的便利.而且它不单单可以生成对象还可以获取Field,对Field设值,

使用Java反射机制确定基本数据类型属性

Java反射机制提供了一种强大的应用程序接口来帮助我们在运行时检测和执行对象上的操作.该机制允许程序员审视一个未知对象,并且获得它的属性,例如对象上的方法,JavaBean的属性以及继承关系等. Java中有两种类型的值,一种是类类型,它把对象的属性定义在一个类中.类类型是面向对象结构的基本组成部分.第二种类型的值是基本数据类型.反射类型通常用于类类型,但是,其实它也可以很方便应用到Java的基本类型上. Java中的基本类型继承自基于C的语法,其中包括boolean.byte.short.in

java 利用java反射机制动态加载类的简单实现_java

如下所示: ////////////////// Load.java package org.bromon.reflect; import java.util.ArrayList; import java.util.List; public class Load implements Operator { @Override public List<?> act(List<?> params) { // TODO Auto-generated method stub List<

Java 反射机制详解及实例代码_java

Java反射详解 本篇文章依旧采用小例子来说明,因为我始终觉的,案例驱动是最好的,要不然只看理论的话,看了也不懂,不过建议大家在看完文章之后,在回过头去看看理论,会有更好的理解. 下面开始正文. [案例1]通过一个对象获得完整的包名和类名 package Reflect; /** * 通过一个对象获得完整的包名和类名 * */ class Demo{ //other codes... } class hello{ public static void main(String[] args) {

reflection的应用-java反射机制的小应用

问题描述 java反射机制的小应用 怎样自己写一个通用的BaseDao(利用反射写出通用的增.删.改.查的方法) 解决方案 去看下hibernate的源码

java反射机制 getreturntype是如何知道方法返回值类型的

问题描述 java反射机制 getreturntype是如何知道方法返回值类型的 各位大神,小弟有一事不明 我们有一个变量,就是方法名 java反射机制 getReturnType()是如何知道我要定义的这个方法的返回值类型. 它怎么知道我要的这个方法应该返回什么值?? 解决方案 java编译后的.class文件里面记录了类的全部信息,包括方法的返回值.参数.异常等.程序运行时,.class文件会被加载到运行时数据区,java反射 机制就是从类型信息中获取装载类解析后的详细信息的. 解决方案二:

java反射机制剖析(一)—简介

    由之前动态代理的学习再次接触到反射这个知识点,第二次接触了所以做了一些稍微深入的了解.那么,对于反射这部分的内容我打算分三篇博客来总结.本篇博客先对反射做一个大概的了解,包括反射有关的RTTI.定义的理解以及涉及到的其他知识的简介. 回顾     java之前我接触反射这个知识,是在大话设计中的抽象工厂模式里,通过反射+配置文件来优化抽象工厂提高其应对需求变更的灵活性.当时对于反射的认知仅仅是它是一种技术,一种实例化对象的技术,一种实例化对象不依赖于写死的代码的技术.简单的说就是,它是一

Java反射机制既然可以拿到class对象,知道其中方法为啥不直接使用对象调用方法?

问题描述 Java反射机制既然可以拿到class对象,知道其中方法为啥不直接使用对象调用方法? Java反射机制既然可以拿到class对象,知道其中方法为啥不直接使用对象调用方法?而要invoke来调用对象的方法? 解决方案 知道方法的话当然可以不用invoke.需要invoke的方法大多是在写代码的时候无法确定的 解决方案二: 问题出现的场景是什么? 解决方案三: 面向接口,有些包是不同厂商实现的 反射能通过编译,在运行时才报错 解决方案四: 没有你想的那么简单,你多看看java的设计模式,和