`
OracleX
  • 浏览: 123550 次
  • 性别: Icon_minigender_1
  • 来自: 地球
社区版块
存档分类
最新评论

Java反射示例

    博客分类:
  • J2SE
 
阅读更多

 

package com.reflection;

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

/**
 * 反射调用一般分为3个步骤:
 * 
 * 1.得到要调用类的class 
 * 2.得到要调用的类中的方法(Method) 
 * 3.方法调用(invoke)
 * 
 * 一般而言,开发者社群说到动态语言,大致认同的一个定义是:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。
 * 从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。
 */
public class MainRefelection {

	public static void main(String args[]) {

		User user = new User();
		try {
			new MainRefelection().showRefelection(user);
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	@SuppressWarnings("rawtypes")
	public void showRefelection(Object object) throws Exception {
		//-------------生成class--------------
//		Class cls = object.getClass();     
		Class cls =Class.forName("com.reflection.User");  //二者都可以
		System.out.println("该对象的类型是:" + cls.toString()); // com.reflection.User

		//----------调用方法-----------------
		Method m = cls.getDeclaredMethod("hello", new Class[] { String.class,int.class }); // 调用方法 参数类型保持一致
		//----------方法调用----------------
		m.invoke(cls, "spark", 20);   //name:spark,age:20
//		m.invoke(cls.newInstance(), "spark",20); // 静态方法调用不需要newInstance()
		
		/**
		 * 向成员变量赋值
		 */
		//1.直接操作成员变量,需要设置访问权限
		Object user = cls.newInstance();
		Field field = cls.getDeclaredField("age");
		field.setAccessible(true); // 向private成员变量赋值时 不加这句话会抛异常 Class
									// com.reflection.MainRefelection can not
									// access a member of class
									// com.reflection.User with modifiers
									// "private"
		field.set(user, 21);
		System.out.println("age:" + field.get(user));  //age:21

		//2.操作成员变量对应的方法,不需要设置访问权限
		Method setMethod = cls.getDeclaredMethod("setAge", int.class); //不是Integer.class
		setMethod.invoke(user, 23); // 调用set方法
		Method getMethod = cls.getDeclaredMethod("getAge");
		System.out.println("age:" + getMethod.invoke(user));  //age:23			调用get方法 
		
		//-----------获得所有的方法--------------
		Method[] methods=cls.getDeclaredMethods();
		System.out.println("方法有:");
		for(int i=0;i<methods.length;i++){
			System.out.print(methods[i].getName()+" ");
		}
		
		//--------获得所有的变量
		Field[] fields=cls.getDeclaredFields();  //cls.getFields() 不对
		System.out.println("变量有:");
		for(int j=0;j<fields.length;j++){
			System.out.print(fields[j].getName()+" ");
		}
		
		// -----生成对象实体------
		// 一种是针对无参数的构造方法,直接cls.newInstance()
		// 另一种是针对有参数的构造方法,比较麻烦。需要先调用cls.getConstructor()获得一个专属的Costructor对象
		// 然后调用Constructor类中的newInstance()

		// 只有两个类拥有newInstance()方法,分别是Class类和Constructor类
		// Class类中的newInstance()方法是不带参数的,而Constructro类中的newInstance()方法是带参数的
		Class clsb = Class.forName("com.reflection.User");
		Class[] prams = new Class[] { int.class, int.class }; // 作为Constructor的参数类型
		Constructor cons = clsb.getConstructor(prams);
		Object[] obj = new Object[] { 11, 22 };
		Object objb = cons.newInstance(obj);
		System.out.println(objb); // com.reflection.User@d9f9c3
	}
	/**
	 * JAVA反射机制主要提供了以下功能: 
	 * 注:前提都是在运行时,而不是在编译时! 
	 * 1.在运行时判断任意一个对象所属的类
	 * 2.在运行时构造任意一个类的对象 
	 * 3.在运行时判断任意一个类所具有的成员变量和方法(通过反射甚至可以调用private方法)
	 * 4.在运行时调用任意一个对象的方法
	 */
}

 

public class User {

	private String name;
	private int age;
	private int id;

	public User(){
		
	}
	public User(int id,int age){
		this.id=id;
		this.age=age;
	}
	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 int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public static void hello(String name, int age) {  //参数类型必须保持一致 是Integer都是Integer
		System.out.println("name:" + name + ",age:" + age);
	}
}

 

分享到:
评论

相关推荐

    Java反射示例代码.rar

    Java反射是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。...提供的"Java反射示例代码.rar"资源正好可以帮助初学者通过实践来理解这些概念。

    java反射示例代码

    Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时检查类、接口、字段和方法的信息,并能动态地创建对象和调用方法。在Java中,反射主要用于以下场景:代码生成、元数据访问、插件系统、框架设计等。...

    JAVA反射示例

    Java反射是Java编程语言中的一个重要特性,它允许程序在运行时检查类、接口、字段和方法的信息,并且能够在运行时动态地创建对象和调用方法。这个特性为Java提供了强大的元数据访问能力,使得代码更加灵活,适用于...

    Java反射机制总结

    以下是一个简单的Java反射示例,展示了如何使用反射来获取类的信息: ```java import java.lang.reflect.*; public class DumpMethods { public static void main(String args[]) { try { Class c = Class.for...

    java 反射ppt 和 code 示例

    Java反射是Java编程语言中的一个重要特性,它允许程序在运行时检查和操作类、接口、字段和方法等对象。在“java 反射ppt 和 code 示例”中,我们可以深入理解这个强大的工具及其在实际开发中的应用。 首先,PPT部分...

    java反射 java反射 java反射java反射

    Java反射是Java编程语言中的一个重要特性,它允许程序在运行时动态地获取类的信息并操作类的对象。在Java中,反射机制提供了强大的能力,包括在运行时检查类的结构、创建对象实例、调用方法以及访问和修改字段值。...

    最简单java 反射原理示例

    以下是对这个“最简单Java反射原理示例”的详细解释。 一、Java反射的概念 Java反射机制允许我们在运行时动态地获取类的信息(如类名、方法名、参数类型等)并调用这些方法。这是通过`java.lang.Class`类和相关API...

    Java反射性能测试分析

    - [Oracle官方文档](https://docs.oracle.com/javase/tutorial/reflect/):提供关于Java反射机制的详细解释和示例。 - [Effective Java](https://www.amazon.com/Effective-Java-3rd-Edition/dp/0134685997):由...

    java反射机制+代码示例

    Java反射机制是Java编程语言中...通过实际的代码示例,学习和理解Java反射机制将变得更加直观和深入。在实际开发中,反射常用于框架、插件系统、序列化/反序列化、测试等方面,但也需要谨慎使用,避免过度依赖和滥用。

    java反射实例代码

    在提供的"java反射实例代码"中,应该包含了如何使用上述方法的实际示例,这些示例有助于加深对Java反射机制的理解。通过阅读和运行这些代码,开发者可以更直观地学习如何在程序运行时动态地操作类、方法和字段,从而...

    Java反射相当的文档及示例

    Java反射是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。这个特性使得动态性、灵活性和元编程成为可能,从而极大地扩展了Java开发者的工具箱。在Java中,...

    JAVA 反射PPT的示例代码

    在本示例中,我们将深入探讨Java反射的概念、用途以及如何通过PPT展示的代码示例来理解这个主题。 首先,我们要明白反射的核心是`java.lang.reflect`包,它包含了一些类和接口,如`Class`、`Constructor`、`Method`...

    java面试题--反射机制

    ### Java反射机制详解 #### 一、引言 在Java面试中,经常会出现与反射...以上内容不仅解释了Java反射机制的相关知识点,还通过示例代码进行了实践演示,希望能够帮助你在Java面试中更好地理解和运用这一重要特性。

    java类反射示例源码

    在"java类反射示例源码"中,我们可以深入理解这个概念并学习如何在实际开发中应用。 反射的使用通常涉及到以下关键知识点: 1. **Class类**: 在Java中,`java.lang.Class`类是所有类的通用表示,每个类都有一个与...

    java反射源码示例+注释详细

    Java反射是Java编程语言中的一个重要特性,它允许程序在运行时动态地获取类的信息并操作类的对象。在Java中,反射API提供了对类、接口、字段和方法等元数据的访问,使得我们可以“看穿”类的封装性,实现一些在编译...

    java中的类反射机制

    接下来,我们将通过一个简单的Java反射示例来进一步理解反射的使用: ```java import java.lang.reflect.*; public class DumpMethods { public static void main(String[] args) { try { Class&lt;?&gt; c = Class....

    反射实例-JAVA反射机制

    下面通过一个简单的示例来展示Java反射机制的工作流程: ```java import java.lang.reflect.*; public class DumpMethods { public static void main(String args[]) { try { Class c = Class.forName(args[0])...

    Java反射经典实例

    在提供的"Java反射经典实例.htm"文件中,可能会包含具体的代码示例,演示如何使用反射创建对象、访问字段、调用方法等。结合文件中的内容,读者可以更深入理解反射的实际应用。 总结,Java反射机制提供了对运行时类...

    java反射使用

    #### 三、Java反射示例代码分析 下面是一些具体的Java反射使用示例代码片段及其解释: 1. **获取并调用对象的属性**: ```java public Object getProperty(Object owner, String fieldName) throws Exception { ...

    精典java程序示例

    11. **反射与注解**:Java反射机制允许在运行时检查类的信息,而注解提供了一种元数据的方式来影响编译过程或运行时行为。示例将解释如何使用这两个高级特性。 12. **单元测试**:JUnit是Java的主要单元测试框架,...

Global site tag (gtag.js) - Google Analytics