黑马程序员技术交流社区

标题: 反射,装饰设计模式 [打印本页]

作者: doglovely    时间: 2016-3-9 22:20
标题: 反射,装饰设计模式
加载?
加载就是把class文件加到内存,并为之生成对应的Class对象。
什么是类加载器?
Bootstrap ClassLoader根加载器,支撑java的基本运行
rt.jar
extension ClassLoader扩展加载器
System ClassLoader 系统类加载器
native本地的
加载之后是一个Class文件
拿到Class文件之后怎么玩?用到反射
java反射机制是在运行状态中。
reflect
反射:就是通过class文件对象,去使用该文件的成员变量,构造方法,成员变量。
Field ,Method,Constructor
获取class文件对象的方式:
全路径名称
右键----》copy name
Class.forName("");开发,是一个字符串,而不是一个具体的类名。这样我们就可以把这样的字符串配置到配置文件中。这个字符串可以随时变,而其它两个就不行
Object.getClass();
类.class

拿到字节码文件,拿到它就是为了用他的成员。
constructor
Class c = Class.forName();
Constructor[] cons=c.getConstructors();
for(Constructor con :cons){
syso(con)
}
getDecaredConstructors()得到所有的构造方法。
Constructor con= c.getConstructor()..可变参数,参数是class类型的
Object obj = con.getInstance();//通过构造器创建一个实例,通过构造方法创建一个实例
System.out.println(obj);输出的时候默认调用obj的toString方法
相当于
Person p = new Person();
System.out.println(p);
反射是不会让你看到任何类的信息的,forName里会做到配置文件。
配置的谁就会运行谁。
需求:通过反射获取该构造方法使用
Person p = new Person("xiao",23,"北京");
System.out.print(p);
//--------------
通过反射获取私有构造方法并使用,在java中私有的不可以被外界访问,但是反射可以访问私有的构造方法
private Person(String name){}
Person s = new Person("风清扬");
//暴力访问
con.setAccessible(true);
getDeclaredConstructor();
以前java可以包装,现在都可以访问。

需求:通过反射获取成员变量并使用
Class c = Class.forName();
Field[] fields = c.getFields();
只能获取公共的成员变量。
getDeclaredFields();
for(Field f :fields){}

Person p = new Person();
p.address = "北京";
syso(o);

Class c = Class.forName();
Field ff = c.getField("address");

ff.set(obj,"北京");
给obj对象的ff字段设置为北京、

Method m1 =c.getMethod();
返回的是object的类型
m1.invoke(obj);//调用obj对象的m1方法

getString(String,int 1);
Method m2=c.getMethod("getString",String.class,int.class)
String ss=m2.invoke(c,"hello",100);

反射练习:
通过反射运行配置文件。
Student s = new Student();
s.love();
Teacher t = new Teacher();
t.love();
硬代码,把代码写死了。
反射后的做法:
一般需要配置文件配合使用
用class.txt代替
className=???
methodName=
键是固定的,值是可变的
Properties prop =new Properties("class.txt");
FileReader fr=("");
prod.load(fr);
fr.close();
加载值对数据
String className = prop.getProperties("className)");

模板设计模式是用抽象类实现的。
需求:计算一段代码的运行时间。
对扩展开放,对修改关闭
定义一个算法的骨架,用子类实现动态的代码。

多态,内部类不太熟悉!

装饰设计模式:
手机
定义手机规则
interface
                           新加彩铃                            听音乐
                         给手机进行装饰                  给手机进行装饰      
具体的手机
用那给就做那个的装饰类。
装饰可以任意组合。在io流中的使用。
InputStream is = System.in
InputStreamReader isr = new InputStreamReader(is):
BufferedReader br = new BufferedReader(isr);
new BufferedReader(new InputStramReader(System.in))




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2