Class类中用于获取构造器的方法:
方法 | 说明 |
---|---|
Constructor>[ ] getConstructors() | 返回所有构造器对象的数组(只能拿public的) |
Constructor>[ ] getDeclaredConstructors() | 返回所有构造器对象的数组,存在就能拿到 |
Constructor< T> getConstructor(Class>… parameterTypes) | 按照参数类型定位并返回单个构造器对象(只能拿public的) |
Constructor< T> getDeclaredConstructor(Class>… parameterTypes) | 返回单个构造器对象,存在就能拿到 |
Constructor类中用于创建对象的方法:
方法 | 说明 |
---|---|
T newInstance(Object… initargs) | 根据指定的构造器创建对象 |
public void setAccessible(boolean flag) | 设置为true,表示取消访问检查(private),进行暴力反射 |
Class类中用于获取成员变量的方法:
方法 | 说明 |
---|---|
Field[ ] getFields() | 返回所有成员变量对象的数组(只能拿public) |
Field[ ] getDeclaredFields() | 返回所有成员变量对象的数组,存在就能拿到 |
Field getField(String name) | 返回单个成员变量对象(只能拿public的) |
Field getDeclaredField(String name) | 返回单个成员变量对象,存在就能拿到 |
Field类中用于取值、赋值的方法
方法 | 说明 |
---|---|
void set(Object obj, Object value) | 赋值 |
Object get(Object obj) | 取值 |
如果某成员变量是非public的,需要打开权限进行暴力反射,然后再取值、赋值;setAccessible(boolean)
Class类中用于获取成员方法的方法
方法 | 说明 |
---|---|
Method[ ] getMethods() | 返回所有成员方法对象的数组(只能拿public的) |
Method[ ] getDeclaredMethods() | 返回所有成员方法对象的数组,存在就能拿到 |
Method getMethod(String name, Class>… parameterTypes) | 返回单个成员方法对象(只能拿public的) |
Method getDeclaredMethod(String name, Class>… parameterTypes) | 返回单个成员方法对象,存在就能拿到 |
Method类中用于触发执行的方法
方法 | 说明 |
---|---|
Object invoke(Object obj, Object… args) | 运行方法,参数一:用obj对象调用该方法;参数二:调用方法的传递的参数 |
自定义注解—格式
public @interface 注解名称{
public 属性类型 属性名() default 默认值;
}
特殊属性:
元注解:
@Target(ElementType.METHOD, ELementType.FIELD)
public @interface MyTest{
}
@Target可使用的值定义在ElementType枚举类中,常用值如下:
@Retention可使用的值定义在RetentionPolicy枚举类中,常用值如下:
与注解解析相关的接口:
方法 | 说明 |
---|---|
Annotation[ ] getDeclaredAnnotations() | 获得当前对象上使用的所有注解,返回注解数组 |
T getDeclaredAnnotation(Class< T> annotationClass) | 根据注解类型获得对应注解对象 |
boolean isAnnotationPresent(Class< Annotation> annotationClass) | 判断当前对象是否使用了指定的注解,如果使用了则返回true,否则false |
解析注解的技巧:
如何创建代理对象:
public static Object newProxyInstance(ClassLoader loader, Class<?>[ ] interfaces, InvocationHandler h)
为对象返回一个代理对象
参数一:定义代理类的类加载器
参数二:代理类要实现的接口列表
参数三:将方法调用分派到的处理程序(代理对象的核心处理程序)
下面是为一个实现Skill接口的Star类的代理类StarAgentProxy
public class StarAgentProxy{
public static Skill getProxy(Star obj){
return (Skill) Proxy.newProxyInstance(obj.getClass().getClassLoader(),
obj.getClass().getInterfaces(), new InvocationHandler(){
@Override
public Object invoke(Object proxy, Method method, Object[ ] args) throws Exception{
System.out.println("收首付款"); //代理做的
Object rs = method.invoke(obj, args); //真正对象做的
System.out.println("收尾款,把明星接回来"); //代理做的
return rs;
}
});
}
前两个参数都是固定的,第三个需要自己重写,代理类也都实现了原始类的接口,因为想要调用原始类的方法时都得通过代理类进行
实现动态代理:
当左右方法前面需要干的事情和后面需要干的事情一致时,我们可以考虑使用代理,例如测试每个方法的运行时间。而且可扩展性超级强,之后原对象里再添加方法,可以直接走代理
XML特点和使用场景:
XML的语法规则
version:XML默认的版本号码
encoding:本XML文件的编码
XML的标签(元素)规则
XML的其他组成
< < 小于
> > 大于
& & 和号
' ' 单引号
" " 引号
DTD
schema
Dom解析的文档对象模型:
得到Document对象:
SAXReader类
方法 | 说明 |
---|---|
public SAXReader() | 创建Dom4J的解析器对象 |
Document read(String url) | 加载XML文件成为Document对象 |
Document类
方法 | 说明 |
---|---|
Element getRootElement() | 获取根元素对象 |
Dom4j解析XML的元素、属性、文本
方法名 | 说明 |
---|---|
List< Element> elements() | 得到当前元素下所有一级子元素 |
List< Element> elements(String name) | 得到当前元素下指定名字的子元素返回集合 |
Element element(String name) | 得到当前元素下指定名字的子元素,如果重名返回第一个 |
String getName() | 得到元素名字 |
String attributeValue(String name) | 通过属性名直接得到属性值 |
String elementText(子元素名) | 得到指定名称的子元素的文本 |
String getText() | 得到文本 |
使用Xpath检索XML文件:
方法名 | 说明 |
---|---|
Node selectSingleNode(“表达式”) | 获取符合表达式的唯一元素 |
List< Node> selectNodes(“表达式”) | 获取符合表达式的元素集合 |
XPath:绝对路径
方法名 | 说明 |
---|---|
/根元素/子元素/孙元素 | 从根元素开始,一级一级向下查找,不能跨级 |
XPath:相对路径
方法名 | 说明 |
---|---|
./子元素/孙元素 | 从当前元素开始,一级一级向下查找,不能跨级 |
XPath:全文搜索
方法名 | 说明 |
---|---|
//name | 找名称为name的元素,无论元素在哪里 |
//contact/name | 找contact,无论在哪一级,但name一定是contact的子节点 |
//contact//name | contact无论在哪一种,name只要是contact的子孙元素都可以找到 |
XPath:属性查找
方法名 | 说明 |
---|---|
//@属性名 | 查找属性对象,无论是哪个元素,只要有这个属性即可 |
//元素[@属性名] | 查找元素对象,全文搜索指定元素名和属性名 |
//元素[@属性名=‘值’] | 查找元素对象,全文搜索指定元素名和属性名,并且属性值相等 |