在看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/
分享到:
相关推荐
【Java教程实践:备忘录详解】 在编程领域,Java是一种广泛应用的面向对象的语言,以其跨平台、稳定性和高效性能而备受青睐。本教程实践备忘录将带你深入理解Java的核心概念,涵盖从基础语法到高级特性,旨在帮助你...
8. **反射**:Java反射机制允许在运行时检查类、接口、字段和方法的信息,并能动态调用方法和改变字段值。这对于测试、插件系统和元编程场景非常有用。 9. **注解(Annotation)**:注解是元数据的一种形式,可以...
3. 行为型模式:观察者、责任链、命令、迭代器、访问者、解释器、备忘录、状态、策略、模板方法等模式的讲解。 这个Java试题大全资源涵盖了上述各个知识点,无论是对于初学者巩固基础,还是对于有一定经验的开发者...
如单例模式、工厂模式、抽象工厂模式、建造者模式、原型模式、适配器模式、桥接模式、过滤器模式、组合模式、装饰器模式、外观模式、...备忘录模式、观察者模式、状态模式、空对象模式、策略模式、模板模式、访问者模式...
JavaStudy 多线程 类加载&反射 设计模式: ... 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
5. **设计模式**:面试中常考的23种设计模式,如单例、工厂、建造者、原型、适配器、装饰器、代理、桥接、组合、职责链、命令、解释器、迭代器、访问者、备忘录、状态、策略、模板方法、观察者、中介者等。...
Java中,静态代理使用接口,动态代理则利用Java反射机制。 13. **责任链模式(Chain of Responsibility)**:避免将处理逻辑硬编码在对象中,让多个对象都有可能处理请求。Java中,通过链式结构串联处理者对象。 ...
3. 行为型模式:命令、责任链、解释器、迭代器、中介者、备忘录、观察者、状态、策略、模板方法模式。 以上知识点涵盖了Java达内面试题库的主要内容,每个部分都值得深入学习和实践。对于准备Java面试的程序员来说...
【标题】"ProyectoFinal-Lenguajes:这是备忘录" 涉及的主要知识点是Java编程语言在软件开发中的应用。这个项目很可能是某个学习或工作中的最终项目,其中可能包含了使用Java语言进行编程的各种技术和实践。 【描述...
3. **行为型模式**:例如策略(Strategy)、模板方法(Template Method)、观察者(Observer)、命令(Command)、迭代器(Iterator)、访问者(Visitor)、备忘录(Memento)、状态(State)、职责链(Chain of ...
- 行为型模式:责任链、命令、解释器、迭代器、备忘录、观察者、状态、策略、模板方法、访问者模式。 6. **其他** - JVM调优:理解GC算法,分析内存泄漏,调整JVM参数。 - 容器技术:Docker、Kubernetes的基础...
- 行为型模式:策略、模板方法、观察者、迭代器、责任链、命令、备忘录、解释器。 以上只是《疯狂Java面试题》中可能涵盖的部分关键知识点,实际内容会更详尽,包括对每个知识点的深度剖析和面试常见问题。通过...
3. 行为型模式:如责任链、命令、解释器、迭代器、备忘录、观察者、状态、策略、模板方法、访问者等,理解这些模式在软件开发中的作用。 八、JVM优化 1. 类加载机制:理解双亲委派模型,以及类加载器的工作原理。 ...
行为型模式包括策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式等。 四、 JDK7和JDK8的区别 JDK7和JDK8之间的主要区别在于JDK...
3. 行为型模式:责任链、命令、解释器、迭代器、中介者、备忘录、观察者、状态、策略、模板方法等模式。 五、JVM内存模型与性能优化 1. 垃圾回收:理解GC的工作原理,熟悉不同垃圾收集器,以及内存泄漏的识别和预防...
- 行为型模式:观察者、模板方法、策略、状态、职责链、命令、迭代器、访问者、备忘录、解释器。 6. **Spring框架**: - IoC(Inversion of Control)和DI(Dependency Injection)的概念。 - AOP(Aspect ...
3. 行为型模式:观察者、模板方法、策略、状态、职责链、命令、迭代器、备忘录等模式。 这些知识点构成了Java面试的核心部分,不仅有助于准备面试,也能提升日常开发中的问题解决能力。不断学习和实践,才能在Java...
- 行为型:观察者,模板方法,策略,职责链,状态,命令,迭代器,访问者,备忘录。 以上只是Java面试中可能涉及的一部分知识点,实际面试可能会更加深入,包括并发编程、数据库操作、框架应用等方面。通过不断...