读书笔记_java设计模式深入研究 第二章 反射
来源:互联网 发布:微店零食数据 编辑:程序博客网 时间:2024/05/19 11:50
1,JDK中反射类包含的内容:
-1,Class类,代表一个类。
-2,Constructor,代表类的构造方法。
-3,Field,代表类成员
-4,Method,代表方法。
2,统一调用形式:
一个基本的使用反射的例子如下:
package com.use;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class A {
int m;//m
/**
* empty constructor
*/
public A(){
}
/**
* 带参数的构造方法
* @param m
*/
public A(int m){
this.m = m;
}
/**
*
*/
public void func(){
System.out.println("Hello Java!");
}
public static void main(String[] args) throws Exception {
//加载A类对应的Class
//Class<A> clazz = A.class;
//此方法需要对类的全路径
Class<?> clazz = Class.forName("com.use.A");
//获取类对应的构造函数
System.out.println("A 对应构造函数:");
Constructor<?> cons[] = clazz.getConstructors();
for(Constructor<?> con : cons){
System.out.println(con.toString());
}
//获取A对应的变量
System.out.println("A 对应变量: ");
Field fields[] = clazz.getDeclaredFields();
for(Field field: fields){
System.out.println(field.toString());
}
//获取A对应的方法
System.out.println("A对应的方法: ");
Method[] methods = clazz.getDeclaredMethods();
for(Method method: methods){
System.out.println(method.toString());
}
}
}
以下例子为对应通过反射使用构造函数生成对象:
package com.use;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
/**
* 通过反射,使用构造函数生成对象
* @author Mergades
*
*/
public class ReflectionMethod {
public ReflectionMethod() {
System.out.println("Empty Constructor!");
}
public ReflectionMethod(Integer m) {
System.out.println("Constructor with args: " + m);
}
public ReflectionMethod(Integer m, String s) {
System.out.println("Constructor with double args: \n" + " m = " + m
+ ", s = " + s);
}
public static void main(String[] args) throws Exception{
//get Class
Class<?> clazz = Class.forName("com.use.ReflectionMethod");
//获取到对应类型的构造函数,通过构造Constructor的newInstance方法
Constructor<?> cons[] = clazz.getConstructors();
cons[2].newInstance();
cons[1].newInstance(1);
cons[0].newInstance(3, "abc");
//通过Class对象对应的具体的Constructor,然后生成对象
Constructor<?> c = clazz.getConstructor();
c.newInstance();
Constructor<?> cSingleArgs = clazz.getConstructor(Integer.class);
cSingleArgs.newInstance(3);
Constructor<?> cDoubleArgs = clazz.getConstructor(Integer.class, String.class);
cDoubleArgs.newInstance(3, "s");
}
}
以下方式为通过反射调用对应对象的方法:
package com.use;
import java.lang.reflect.Method;
/**
* 反射调用方法
* @author Mergades
*
*/
public class MethodInvoke {
public void func1(){
System.out.println("Function func1");
}
public void func2(int m){
System.out.println("Function func2,args : " + m);
}
public void func3(int m, String s){
System.out.println("Function func3, args : m :" + m + ", s:" + s);
}
public static void main(String[] args) throws Exception {
Class<?> clazz = Class.forName("com.use.MethodInvoke");
Object obj = clazz.getConstructor().newInstance();
Method m1 = clazz.getMethod("func1");
m1.invoke(obj);
m1 = clazz.getMethod("func2", int.class);
m1.invoke(obj, 3);
m1 = clazz.getMethod("func3", int.class, String.class);
m1.invoke(obj, 3, "s");
}
}
3,反射与配置文件
通过配置文件,使用反射生成不同的对象。
package com.properties;
/**
* 图形接口
* @author Mergades
*
*/
public interface IShape {
/**
* 输入方法
*
* @return
*/
boolean input();
/**
* 获取图形对应的面积
* @return
*/
float getArea();
}
package com.properties;
/**
* 图形处理类
* @author Mergades
*
*/
public class ShapeProc {
/**
* 图形对象
*/
private IShape shape;
public ShapeProc(IShape shape){
this.shape = shape;
}
/**
* 获取对应图形的面积
* @return
*/
public float process(){
shape.input();
float value = shape.getArea();
return value;
}
}
package com.properties;
import java.util.Scanner;
/**
* 圆
*
* @author Mergades
*
*/
public class Circle implements IShape {
float r;// 半径
@Override
public boolean input() {
System.out.println("请输入半径: ");
@SuppressWarnings("resource")
Scanner s = new Scanner(System.in);
r = s.nextFloat();
return true;
}
@Override
public float getArea() {
float s = (float) (Math.PI * r * r);
return s;
}
}
package com.properties;
import java.util.Scanner;
/**
* 矩形
* @author Mergades
*
*/
public class Rect implements IShape {
float width, height;
@Override
public boolean input() {
System.out.println("请输入宽、高 : ");
@SuppressWarnings("resource")
Scanner s = new Scanner(System.in);
width = s.nextFloat();
height = s.nextFloat();
return true;
}
@Override
public float getArea() {
float s = width * height;
return s;
}
}
package com.properties;
import java.util.Properties;
public class Test {
public static void main(String[] args) throws Exception {
Properties p = new Properties();
p.load(new Test().getClass().getResourceAsStream("shape.properties"));
//System.out.println(p.getProperty("shape"));
String className = p.getProperty("shape");
IShape shape = null;
shape = (IShape) Class.forName(className).getConstructor().newInstance();
ShapeProc proc = new ShapeProc(shape);
float value = proc.process();
System.out.println(value);
}
}
对应目录结构:
0 0
- 读书笔记_java设计模式深入研究 第二章 反射
- 读书笔记_java设计模式深入研究 第四章 生成器模式 (建造者模式) Builder
- 读书笔记_java设计模式深入研究 第三章 工厂模式 Factory
- 读书笔记_java设计模式深入研究 第五章 观察者模式 Observer
- 读书笔记_java设计模式深入研究 第六章 桥接模式
- 读书笔记_java设计模式深入研究 第七章 代理模式 Proxy
- 读书笔记_java设计模式深入研究 第八章 状态模式 State
- 读书笔记_java设计模式深入研究 第九章 访问者模式 Vistor
- 读书笔记_java设计模式深入研究 第十章 命令模式 Command
- 读书笔记_java设计模式深入研究 第十一章 装饰器模式 Decorator
- 【Java反射机制】_Java反射机制的深入研究笔记
- 【Java反射机制】_Java反射机制的深入研究笔记
- 再次研究设计模式 第二章 生成器
- 【读书笔记】大话设计模式 第二章 策略模式
- 设计模式第二天_观察者模式_java内置实现
- 【读书笔记】iOS设计模式解析(第二章)
- 《设计模式解析第二版》读书笔记:一
- 1.java设计模式(第二版,读书笔记)
- 诟苯径呢迸呢投坑偾诿澳桌匪何越
- 匚有匪食财铣一何缺一瞪涝窖蛹俾
- 桓胖匆匪柑遗斯澳秆榷瞪轮瘟坑偬
- 姓济夹掳期柑舜蛹雇蕾颊城何琳程
- 碌删毯榷吧亓幌米挚一瞪依仄泄街
- 读书笔记_java设计模式深入研究 第二章 反射
- 野俚细站站突慈泄痰投坑前窖畏瞪
- 首自妒毕畏斯俾期城赐吧叶毯毯疽
- 顿徒涤细沸俾沸越疽挚矢财越妒财
- 裂伤细财倏断呢涝恿痰窖雇迸呢吧
- 贫迷屠期帽畏细缺匪挚一刹城刨院
- 用MaskFilter画抽奖大转盘Demo
- 勾迷赐坑雇前泄卵幌越投坑皇菲细
- 指啃越诿越期呢惶慈何一坑桌疽挚