`
lgsun592
  • 浏览: 54803 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java反射备忘录

    博客分类:
  • Java
阅读更多
在看spring的时候发现很多都是通过反射实现的,所以也看了看java关于反射的部分,总结如下,方便以后查找
Arithmetic.java
/**  
 * Class Arithmetic 
 * 反射目标类
 * 水平有限,所以此类纯是为了测试而写,无任何逻辑而言
 * @author  lgsun
 * Date: 2011-3-27
 */
package com.lgsun.target;

@SuppressWarnings("all")
public class Arithmetic
{
	private int	parmaerOne;
	private int	parmaerTwo;
	public int	sum;

	private Arithmetic()
	{
		this.parmaerOne = -1;
		this.parmaerTwo = -2;
	}

	public Arithmetic(int parmaerOne, int parmaerTwo)
	{
		this.parmaerOne = parmaerOne;
		this.parmaerTwo = parmaerTwo;
	}

	public int getParmaerOne()
	{
		return parmaerOne;
	}

	public void setParmaerOne(int parmaerOne)
	{
		this.parmaerOne = parmaerOne;
	}

	public int getParmaerTwo()
	{
		return parmaerTwo;
	}

	public void setParmaerTwo(int parmaerTwo)
	{
		this.parmaerTwo = parmaerTwo;
	}

	public int getSum()
	{
		sum = sum(parmaerOne, parmaerTwo);
		return this.sum;
	}

	public double getDivision()
	{
		return (parmaerOne / parmaerTwo);
	}

	private int sum(int p1, int p2)
	{
		return (p1 + p2);
	}

	public void getInfo()
	{
		System.out.println();
		System.out.println("parmaerOne=" + parmaerOne);
		System.out.println("parmaerTwo=" + parmaerTwo);
		System.out.println("sum=" + sum);
	}
}


ReflectConstructor.java
/**  
 * Class ReflectConstructor 
 * Constructor getConstructor(Class[] params) -- 获得使用特殊的参数类型的公共构造函数, 
 * Constructor[] getConstructors() -- 获得类的所有公共构造函数 
 * Constructor getDeclaredConstructor(Class[] params) -- 获得使用特定参数类型的构造函数(与接入级别无关) 
 * Constructor[] getDeclaredConstructors() -- 获得类的所有构造函数(与接入级别无关)
 * 前2个可以返回继承自父类的构造方法;后2个只能返回当前类定义的,并且包含私有方法
 * @author  lgsun
 * Date: 2011-3-27
 */
package com.lgsun.test;

import java.lang.reflect.Constructor;
import com.lgsun.target.Arithmetic;

public class ReflectConstructor
{
	@SuppressWarnings("all")
	public static void main(String[] args)
	{
		try
		{
			// 返回Arithmetic类全部的构造方法,包含私有构造方法
			Constructor[] con = Class.forName("com.lgsun.target.Arithmetic").getDeclaredConstructors();
			for (int i = 0; i < con.length; i++)
			{
				System.out.println(con[i].toGenericString());
			}

			// 通过Arithmetic(int p1,int p2)构造方法创建实例
			Class[] type = new Class[] { int.class, int.class };
			Constructor pCon1 = Class.forName("com.lgsun.target.Arithmetic").getDeclaredConstructor(type);
			Arithmetic arit1 = (Arithmetic) pCon1.newInstance(3, 4);
			arit1.getInfo();

			// 通过Arithmetic()构造方法创建实例
			Constructor pCon2 = Class.forName("com.lgsun.target.Arithmetic").getDeclaredConstructor();
			// 由于此构造方法是私有的,所以必须设置Accessible为true
			pCon2.setAccessible(true);
			Arithmetic arit2 = (Arithmetic) pCon2.newInstance();
			arit2.getInfo();
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
	}
}


ReflectMethod.java
/**  
 * Class ReflectMethod 
 * Method getMethod(String name, Class[] params) -- 使用特定的参数类型,获得命名的公共方法 
 * Method[] getMethods() -- 获得类的所有公共方法 
 * Method getDeclaredMethod(String name, Class[] params) -- 使用特写的参数类型,获得类声明的命名的方法 
 * Method[] getDeclaredMethods() -- 获得类声明的所有方法
 * 前2个方法会返回所有的属性,包括父类属性;后2个只会返回此类中定义的属性,包含私有属性
 * @author  lgsun
 * Date: 2011-3-28
 */
package com.lgsun.test;

import java.lang.reflect.Method;

import com.lgsun.target.Arithmetic;

@SuppressWarnings("all")
public class ReflectMethod
{
	public static void main(String[] args)
	{
		Arithmetic arithmetic = new Arithmetic(7, 8);
		Method[] methods = arithmetic.getClass().getDeclaredMethods();
		for (int i = 0; i < methods.length; i++)
		{
			System.out.println(methods[i].toGenericString());
		}

		try
		{
			Class[] types = new Class[] { int.class, int.class };
			Method method1 = arithmetic.getClass().getDeclaredMethod("sum", types);
			method1.setAccessible(true);
			// 这样写是错误的
			// int[] parms=new int[]{17,18};
			Object[] parms = new Object[] { 17, 18 };
			Object result = method1.invoke(arithmetic, parms);

			System.out.println(((Integer) result).intValue());
			arithmetic.getInfo();
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}

	}
}


ReflectFiled.java
/**  
 * Class ReflectFiled 
 * Field getField(String name) -- 获得命名的公共字段 
 * Field[] getFields() -- 获得类的所有公共字段 
 * Field getDeclaredField(String name) -- 获得类声明的命名的字段 
 * Field[] getDeclaredFields() -- 获得类声明的所有字段
 * 同样,前2个方法会返回所有的属性,包括父类属性;后2个只会返回此类中定义的属性,包含私有属性
 * @author  lgsun
 * Date: 2011-3-28
 */
package com.lgsun.test;

import java.lang.reflect.Field;

import com.lgsun.target.Arithmetic;

public class ReflectFiled
{
	@SuppressWarnings("all")
	public static void main(String[] args)
	{
		// 返回Arithmetic类全部属性,包含私有属性
		Arithmetic arithmetic = new Arithmetic(4, 5);
		Field[] fields = arithmetic.getClass().getDeclaredFields();
		for (int i = 0; i < fields.length; i++)
		{
			System.out.println(fields[i].toGenericString());
		}

		try
		{
			// 直接给public属性sum赋值
			Field field1 = arithmetic.getClass().getDeclaredField("sum");
			field1.set(arithmetic, 19);
			arithmetic.getInfo();

			// 给private属性parmaerOne赋值
			Field field2 = arithmetic.getClass().getDeclaredField("parmaerOne");
			// 必加
			field2.setAccessible(true);
			field2.set(arithmetic, 14);
			arithmetic.getInfo();
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
	}
}


附件为工程文件
参考http://www.ibm.com/developerworks/cn/java/j-dyn0603/
0
0
分享到:
评论

相关推荐

    Tutorial-Practice:我的Java Turorial备忘录

    【Java教程实践:备忘录详解】 在编程领域,Java是一种广泛应用的面向对象的语言,以其跨平台、稳定性和高效性能而备受青睐。本教程实践备忘录将带你深入理解Java的核心概念,涵盖从基础语法到高级特性,旨在帮助你...

    备忘录

    8. **反射**:Java反射机制允许在运行时检查类、接口、字段和方法的信息,并能动态调用方法和改变字段值。这对于测试、插件系统和元编程场景非常有用。 9. **注解(Annotation)**:注解是元数据的一种形式,可以...

    JAVA试题大全

    3. 行为型模式:观察者、责任链、命令、迭代器、访问者、解释器、备忘录、状态、策略、模板方法等模式的讲解。 这个Java试题大全资源涵盖了上述各个知识点,无论是对于初学者巩固基础,还是对于有一定经验的开发者...

    Java基础知识点总结.docx

    如单例模式、工厂模式、抽象工厂模式、建造者模式、原型模式、适配器模式、桥接模式、过滤器模式、组合模式、装饰器模式、外观模式、...备忘录模式、观察者模式、状态模式、空对象模式、策略模式、模板模式、访问者模式...

    JavaStudy:Java 学习记录

    JavaStudy 多线程 类加载&反射 设计模式: ... 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

    Java面试题资料

    5. **设计模式**:面试中常考的23种设计模式,如单例、工厂、建造者、原型、适配器、装饰器、代理、桥接、组合、职责链、命令、解释器、迭代器、访问者、备忘录、状态、策略、模板方法、观察者、中介者等。...

    23种设计模式的Java实现

    Java中,静态代理使用接口,动态代理则利用Java反射机制。 13. **责任链模式(Chain of Responsibility)**:避免将处理逻辑硬编码在对象中,让多个对象都有可能处理请求。Java中,通过链式结构串联处理者对象。 ...

    java达内面试题库

    3. 行为型模式:命令、责任链、解释器、迭代器、中介者、备忘录、观察者、状态、策略、模板方法模式。 以上知识点涵盖了Java达内面试题库的主要内容,每个部分都值得深入学习和实践。对于准备Java面试的程序员来说...

    ProyectoFinal-Lenguajes:这是备忘录

    【标题】"ProyectoFinal-Lenguajes:这是备忘录" 涉及的主要知识点是Java编程语言在软件开发中的应用。这个项目很可能是某个学习或工作中的最终项目,其中可能包含了使用Java语言进行编程的各种技术和实践。 【描述...

    java与模式 光盘内容

    3. **行为型模式**:例如策略(Strategy)、模板方法(Template Method)、观察者(Observer)、命令(Command)、迭代器(Iterator)、访问者(Visitor)、备忘录(Memento)、状态(State)、职责链(Chain of ...

    java面试题库.zip

    - 行为型模式:责任链、命令、解释器、迭代器、备忘录、观察者、状态、策略、模板方法、访问者模式。 6. **其他** - JVM调优:理解GC算法,分析内存泄漏,调整JVM参数。 - 容器技术:Docker、Kubernetes的基础...

    疯狂Java面试题

    - 行为型模式:策略、模板方法、观察者、迭代器、责任链、命令、备忘录、解释器。 以上只是《疯狂Java面试题》中可能涵盖的部分关键知识点,实际内容会更详尽,包括对每个知识点的深度剖析和面试常见问题。通过...

    2015年腾讯Java工程师笔试题.zip

    3. 行为型模式:如责任链、命令、解释器、迭代器、备忘录、观察者、状态、策略、模板方法、访问者等,理解这些模式在软件开发中的作用。 八、JVM优化 1. 类加载机制:理解双亲委派模型,以及类加载器的工作原理。 ...

    JavaSE常见面试题-高级反射-JVM篇.pdf

    行为型模式包括策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式等。 四、 JDK7和JDK8的区别 JDK7和JDK8之间的主要区别在于JDK...

    java程序员面试宝典pdf版

    3. 行为型模式:责任链、命令、解释器、迭代器、中介者、备忘录、观察者、状态、策略、模板方法等模式。 五、JVM内存模型与性能优化 1. 垃圾回收:理解GC的工作原理,熟悉不同垃圾收集器,以及内存泄漏的识别和预防...

    Java面试题及答案大全(2023持续更新)

    - 行为型模式:观察者、模板方法、策略、状态、职责链、命令、迭代器、访问者、备忘录、解释器。 6. **Spring框架**: - IoC(Inversion of Control)和DI(Dependency Injection)的概念。 - AOP(Aspect ...

    java面试题 学习笔记

    3. 行为型模式:观察者、模板方法、策略、状态、职责链、命令、迭代器、备忘录等模式。 这些知识点构成了Java面试的核心部分,不仅有助于准备面试,也能提升日常开发中的问题解决能力。不断学习和实践,才能在Java...

    模拟面试 Java题目以及答案

    - 行为型:观察者,模板方法,策略,职责链,状态,命令,迭代器,访问者,备忘录。 以上只是Java面试中可能涉及的一部分知识点,实际面试可能会更加深入,包括并发编程、数据库操作、框架应用等方面。通过不断...

Global site tag (gtag.js) - Google Analytics