`

java的反射机制

 
阅读更多

问题:java程序在运行时,对于一个java类,能否知道属性和方法;能否去调用它的任意方法? 答案是肯定的,就是使用java的反射机制。

一、什么是反射机制

       简解:Java可以加载一个运行时才得知名称的class,获得其完整结构。

二、哪里用到反射机制    

 

三、反射机制的优点与缺点
        为什么要用反射机制?直接创建对象不就可以了吗,这就涉及到了动态与静态的概念,
    静态编译:在编译时确定类型,绑定对象,即通过。
    动态编译:运行时确定类型,绑定对象。动态编译最大限度发挥了java的灵活性,体现了多态的应用,有以降低类之间的藕合性。
    一句话,反射机制的优点就是可以实现动态创建对象和编译,体现出很大的灵活性,特别是在J2EE的开发中它的灵活性就表现的十分明显。比如,一个大型的软件,不可能一次就把把它设计的很完美,当这个程序编译后,发布了,当发现需要更新某些功能时,我们不可能要用户把以前的卸载,再重新安装新的版本,假如这样的话,这个软件肯定是没有多少人用的。采用静态的话,需要把整个程序重新编译一次才可以实现功能 的更新,而采用反射机制的话,它就可以不用卸载,只需要在运行时才动态的创建和编译,就可以实现该功能。
       它的缺点是对性能有影响。使用反射基本上是一种解释操作,我们可以告诉JVM,我们希望做什么并且它
    满足我们的要求。这类操作总是慢于只直接执行相同的操作。   

Java反射机制提供如下功能:

1、在运行时判断任意一个对象所属的类

2、在运行时构造任意一个类的对象

3、在运行时判段任意一个类所具有的成员变量和方法

4、在运行时调用任一个对象的方法

5、在运行时创建新类对象

在使用Java的反射功能时,基本首先都要获取类的Class对象,再通过Class对象获取其他的对象。

package lxf;

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

class Person {
	private String name;
	private int age;

	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}

	public Person() {
		// TODO Auto-generated constructor stub
	}

	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;
	}

}

/**
 * 使用反射机制来创建对象
 * 
 * @author lxf
 * @time 2014-4-8下午05:08:41
 * 
 */
public class CreateObject {

	/**
	 * Java的反射机制是指:反射就是把Java类中的各种成分映射成相应相应的Java类, 然后就可以获取这个类的所有信息
	 * 
	 * @throws Exception
	 */
	public static void createObj1() throws Exception {
		// 返回与带有给定字符串名的类或接口相关联的 Class 对象。
		// Class classType = Person.class;
		Class classType = Class.forName("lxf.Person");
		Object obj = classType.newInstance();
		System.out.println("使用反射反射机制创建出来的对象是否是Person类的对象:"
				+ (obj instanceof Person));
	}

	/**
	 * 创建带有构造参数的对象的时候我们需要使用另外一种方式即: 1.先获取操作类的Class对象即字节码文件
	 * 2.使用Class对象的getConstructor
	 * (parameterTypes)方法获取该对象的构造方法的对象,注意括号中可以带不等的可变参数,
	 * 3.使用构造方法对象的newInstance(initargs)方法就可以实例化一个对象 4.注意,使用这些方法都不可以访问被
	 * private修饰的方法,需要设置某些访问权限setAccessable()方法
	 * 
	 * @throws Exception
	 */
	public static void createObj2() throws Exception {
		@SuppressWarnings("rawtypes")
		Class classType = Person.class;

		@SuppressWarnings("unchecked")
		Constructor<Person> con = classType.getConstructor(String.class,
				int.class);
		Object obj = con.newInstance("lxf", 23);
		System.out.println("使用constructor对象的newInstance方法创建对象的信息:"
				+ ((Person) obj).getName());
	}

	/**
	 * 操作方法包括(private方法) 步骤: 1.首先获取要操作类的Class对象
	 * 2.然后通过Class对象的getMethod方法获取要操作的方法的Method对象(两个参数,第一个参数是方法名,第二个参数是参数类型)
	 * 3.调用Method的方法的invoke方法(两个参数,第一个参数是该方法属于的类对象,具体参数)
	 * 4.当方法被private修饰的时候,首先需要调用getDeclaredMethod()方法获取要操作的被private修饰的类。
	 * 在这里要注意这个getDeclaredMethod方法,它既可以用作获取普通方法的对象也可以用来操作private修饰的方法,
	 * 但是操作private修饰的方法的时候,必须使用这个方法,其它方法不可以。普通方法还可以使用getMethod方法,
	 * 且属性操作也是如此。另外,还需要设置访问权限setAccessable(true)才可以
	 * 
	 * @throws Exception
	 */
	public static void methodDo() throws Exception {
		Person p = new Person();
		Class classType = Person.class;
		Method method = classType.getMethod("setName", String.class);
		method.invoke(p, "ckl");
		System.out.println("使用反射操作SetName方法后,Person对象的name值是:" + p.getName());

		Method method2 = classType.getDeclaredMethod("test");
		method2.setAccessible(true);
		method2.invoke(p);
	}

	/**
	 * 操作字段
	 * 
	 * @throws Exception
	 */
	public static void FieldDo() throws Exception {
		Person p = new Person();
		Class classType = Person.class;
		Field field = classType.getDeclaredField("name");
		Field field2 = classType.getDeclaredField("age");
		field.setAccessible(true);
		field2.setAccessible(true);
		field.set(p, "lxf");
		field2.set(p, 23);
		System.out.println("使用反射机制操作被private修饰的对象字段后得到的属性值是:" + p.getName());
		System.out.println("使用反射机制操作被private修饰的对象字段后得到的属性值是:" + p.getAge());
	}

	public static void main(String[] args) throws Exception {
		new CreateObject().FieldDo();
	}

}

 

分享到:
评论

相关推荐

    java反射机制.zip

    java反射机制java反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制...

    java反射机制

    Java反射机制是Java编程语言中的一个强大工具,它允许程序在运行时检查和操作类、接口、对象等的内部结构。通过反射,开发者能够在运行时动态地获取类的信息(如类名、方法名、参数类型)并调用方法,创建对象,甚至...

    JAVA反射机制应用

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

    Java反射机制的实现_Reflection

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象等的内部信息。通过Java反射机制,开发者可以在不知道具体类名的情况下创建对象,调用方法,访问和修改私有成员变量,以及...

    一个例子让你了解Java反射机制

    Java反射机制是Java编程语言中的一个重要特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类集中在java.lang.reflect包下,包括Class、Constructor、Method和...

    java 反射机制

    ### Java反射机制深入理解 #### 一、反射机制概述 Java反射机制是一种强大的工具,它允许程序在运行时检查和操作任何类、方法、构造函数和字段等元素。这种能力对于构建灵活的应用程序和框架非常有用,特别是那些...

    JAVA反射机制的简单理解

    Java反射机制是Java语言提供的一种强大工具,它允许在程序运行时动态地获取类的信息以及对类的对象进行操作。在Java中,静态编译时类型检查确保了代码的稳定性,但有时我们需要在运行时根据需求动态地创建对象、调用...

    Java 反射机制 代码的实例

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象等的内部结构。通过反射,开发者可以动态地获取类的信息并调用其方法,创建对象,访问私有成员,甚至改变类的行为。在深入...

    候捷谈Java反射机制

    Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时获取和操作任何已知名称的类的内部信息。这一机制使得Java具备了一定的动态性,虽然在传统的分类中Java被视为静态类型语言。通过反射,开发者可以在...

    java 反射机制详解

    Java 反射机制是 Java 语言中的一个重要特性,它允许程序在运行时动态地获取类的信息(如类名、属性、方法等)并调用对象的方法,甚至修改对象的状态。这一机制极大地增强了 Java 程序的灵活性和可扩展性,尤其是在...

    Java反射机制学习(二)

    这篇博文"Java反射机制学习(二)"可能深入探讨了如何利用反射进行动态类型处理、访问私有成员以及创建对象等核心概念。在这里,我们将详细讨论Java反射的基本用法及其在实际开发中的应用。 1. **什么是反射**: ...

    java反射机制和动态代理的原理

    java反射机制和动态代理的原理,熟悉反射机制和动态代理

    Java反射机制 Java反射机制

    ### Java反射机制详解 #### 一、Java反射机制概述 Java反射机制是Java语言的一个重要特性,它允许程序在运行时获取类的信息并操作对象。Java反射机制的主要作用包括:获取类的所有属性和方法、构造动态实例、调用...

    Java反射机制课件ppt

    Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时动态地获取类的信息并操作类的对象。这种机制使得Java具有高度的灵活性和动态性,可以在编译时未知类的情况下进行类的加载、实例化、方法调用等操作...

    java反射机制工具类

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、字段和方法的信息。这个特性使得Java具备了高度的灵活性,能够在运行时动态地发现和使用类的属性和方法,即使这些信息在编译时...

    java反射机制,很安逸.不要错过

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查并操作类、接口、字段和方法的信息,打破了通常编译时静态绑定的限制。通过反射,我们可以动态地创建对象,调用方法,访问和修改字段值,甚至...

    java面试题--反射机制

    ### Java反射机制详解 #### 一、引言 在Java面试中,经常会出现与反射机制相关的题目。这是因为Java反射机制不仅是Java语言的一项重要特性,也是理解Java动态特性的关键所在。通过本文,我们将深入探讨Java反射...

    java反射机制核心代码

    java反射机制核心代码,小弟一直弄不明白,怎么通过反射来调用私有成员方法,看了这个后,你可以随心调用private方法,和属性,记得添加setAccessable(true),哦,要不还是不行,如:method.setAccessable(true);

    Java反射机制总结(实例分析)

    Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时动态地获取类的信息并进行操作。通过反射,开发者可以在程序执行时发现并访问类的字段(fields)、方法(methods)以及构造器(constructors),...

Global site tag (gtag.js) - Google Analytics