1.反射机制举例
package com.neusoft2;
import java.lang.reflect.Constructor;
import java.lang.reflect.Parameter;
public class Text {
public static void main(String[] args) {
try {
// .class字节码文件
// Class《?》 代表的是类的信息,pinfo是preson类的字节码文件对象
Class<Preson> pinfo=(Class<Preson>) Class.forName("com.neusoft2.Preson");
// 得到一个构造器数组,代表构造器集合
Constructor [] cs=pinfo.getConstructors();
for(Constructor c:cs) {
// 输出构造器的名字
System.out.println(c.getName());
// 每个构造器参数组成的数组
Parameter[] ps=c.getParameters();
for(Parameter p:ps) {
// 每个参数的名字
System.out.println(p.getName());
// 每个参数对应的类型
System.out.println(p.getType().getTypeName());
}
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//利用反射机制 得到类的(私有属性也可以得到)属性
//类的字段等价于类的属性
// 得到的preson类的name属性
Field pname=pinfo.getDeclaredField("name");
// 反射机制可以访问私有属性,甚至给私有属性赋值
// 对私有属性进行改变 让其可以被访问
pname.setAccessible(true);
// 给私有属性赋值前依然需要得到Preson类的对象。利用字节码对象的newinstance()得到的
Preson p1=pinfo.newInstance();
pname.set(p1, "你好");
System.out.println(p1.getName());
//利用反射机制获得方法(包括父类 继承关系的方法)
Method pchu=pinfo.getMethod("chu", null);
pchu.invoke(p1, null);
//pinfo.getDeclaredMethod(name, parameterTypes)
//利用反射机制得到接口实现的方法
2.使用场景:
2.1首先通过解析xml文件
2.2得到所谓的插件的字节码
2.3通过字节码的newIntance方法得到接口实现类对象,然后在转型相应接口类型 在为app的业务方法使用
package com;
import java.io.File;
import java.util.Iterator;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class App {
private Query dq;
public void doQuery(){
dq.doQuery();
}
public void setDq(Query dq) {
this.dq = dq;
}
public void init(){
// 1.创建Reader对象
SAXReader sr = new SAXReader();
// 2.加载文档
File f = new File("myxml/Student.xml");
// 3.获取根元素
try {
// 4.获得xml文档对象
Document document = sr.read(f);
// 5.获取XML文档的根节点
Element root = document.getRootElement();
// 6.获取遍历子元素的迭代器
Iterator<Element> iterator = root.elementIterator();
while (iterator.hasNext()) {
// 获取第一层级user节点
Element user = iterator.next();
// 获取每层user下的子节点迭代器
Iterator<Element> cniterator = user.elementIterator();
while (cniterator.hasNext()) {
Element cn = cniterator.next();
System.out.println(cn.getName() + ":" + cn.getStringValue());
Class uc = Class.forName(cn.getStringValue());
this.setDq((Query) uc.newInstance());
}
}
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
解析xml 4j
package com;
import java.io.File;
import java.util.Iterator;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class Dom4JDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
// 1.创建Reader对象
SAXReader sr = new SAXReader();
// 2.加载文档
File f = new File("myxml/Student.xml");
// 3.获取根元素
try {
// 4.获得xml文档对象
Document document = sr.read(f);
// 5.获取XML文档的根节点
Element root = document.getRootElement();
// 6.获取遍历子元素的迭代器
Iterator<Element> iterator = root.elementIterator();
while (iterator.hasNext()) {
// 获取第一层级user节点
Element user = iterator.next();
// 获取每层user下的子节点迭代器
Iterator<Element> cniterator = user.elementIterator();
while (cniterator.hasNext()) {
Element cn = cniterator.next();
System.out.println(cn.getName() + ":" + cn.getStringValue());
Class uc = Class.forName(cn.getStringValue());
}
}
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}