1、反射
在编译时,不确定哪个类被加载,而在程序运行时才加载,探知,使用
反射案例:不知道类加载进去是什么,加载进去后,采取探知,属性、方法、类
Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;
对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。
2、反射的用处:
javaweb框架,省略代码,运行时检查程序员输入的内容、根据输入的内容取探知属性、方法
3、创建Class(类类型)对象
方法一:Class cla=Class.forName("包名+类名(全路径)");
eg:Class dateclass_2=Class.forName("java.util.Date");
方法二:Class cla=实例.getclass(参数);//参数为一个对象
方法三:Class cla=类.class;
eg:Class dateclass_1=Date.class;
System.out.println(dateclass_1);//class java.util.Date
Date d1=(Date) dateclass_1.newInstance();//new一个Date的实例
4、获取属性
eg:Field fieldName=studentClass.getDeclaredField("name");//获取属性 name
System.out.println("获得的属性:"+fieldName);//获得的属性:private java.lang.String reflect_1.Student.name
Student s=new Student();//new一个Student对象
System.out.println(s.getName());//null
fieldName.setAccessible(true);//赋予设置的权限(原属性为private)
fieldName.set(s, "小明");//给对象s设置name“小明”
System.out.println(s.getName());//小明
Field[] sf=studentClass.getDeclaredFields();//获得Student中的全部属性 Field[]
for (Field f:sf) {//增强型for循环遍历Field[],输出属性的名字
System.out.println("Student中的属性:"+f.getName());
}
5、获取方法
eg:Class<Student> c = Student.class;//创建类类型
Method m2 = c.getDeclaredMethod("setName", String.class);//获得方法 写方法参数的类类型String.class
Student s = new Student();//实例化一个新对象s
m2.invoke(s, "小红");//调用S的setName方法 invoke 调用
Method[] ms = c.getDeclaredMethods();//获取所有的方法
for (Method m : ms) {//增强型for遍历Method数组,输出方法名
System.out.println("Student的方法:" + m.getName());
}
6、获取构造方法
eg:Class<Student> c=Student.class;
Constructor<Student> sm=c.getConstructor(int.class,String.class,String.class);
sm.newInstance(12,"小敏","男");
7、AOP—面向切面的编程(Aspect Oriented Programming)
动态的加入和删除在切面上的逻辑,而不去修改源码
切面要实现一个接口 InvocationHandler
属性为被代理的对象---private Object target;
重写invoke方法:
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
beforeMethod();
method.invoke(target, args);
afterMethod();
return null;
}
测试类:
UserDAO us = new UserDAOImp();
logInterceptor l = new logInterceptor(us);//切面
//生成代理对象
// 参数 :1-类加载器;2-类的接口;3-切面
UserDAO us2 = (UserDAO) Proxy.newProxyInstance(us.getClass().getClassLoader(),
us.getClass().getInterfaces(),l);
作用:方法前后加入日志;计时;操作权限
8、内部类
类内部再定义一个类;他能访问外部类的所有数据,包括private的.
a、成员式内部类:
eg:Outer.Inter x=new Outer().new Inter();//内部类不加static,new一个对象
Outer.Inter x=new Outer.Inter();//内部类加了static,new一个对象
b、内部类,外部类的方法和属性不能互相调用
c、匿名内部类:只有一个实例,而且没有引用
9、配置文件—json xml properties
a、json---JavaScript Object Notation 对象简谱
键:值 --- 对的形式
步骤:1、导包 gson.jar
2、写一个json 对象
JsonObject jb=new JsonObject();//new一个json对象
//写到 demo.json文件
PrintWriter pw=new PrintWriter(new FileOutputStream("demo.json"));
jb.addProperty("cn", "中国");
pw.write(jb.toString());
3、Jsonarray Json数组
eg:JsonArray ja=new JsonArray();//new一个Json数组
ja.add(jb);//数组里添加Json对象
4、写入对象
eg:pw.write(new Gson().toJson(map));//要用new Gson().toJson(要写的对象列表);
5、读取
eg://读取
JsonObject jo =(JsonObject) jp.parse(new FileReader("demo.json"));
jo.get("aaa");
eg://读取写入gson的list
JsonArray ja=(JsonArray) jp.parse(new FileReader("demo.json"));
Person[] ps= new Gson().fromJson(ja.toString(), Person[].class);
for (Person p:ps) {
System.out.println(p.toString());
}
b、Xml 的读取
XML的解析方式分为四种:1、DOM解析;2、SAX解析;3、JDOM解析;4、DOM4J解析。
eg://1-获取工具 SAXreader
SAXReader reader=new SAXReader();
//2-将xml转换成document文档
Document doc=reader.read("demo.xml");
//3-生成根节点
Element eles=doc.getRootElement();
//4-遍历rootElement
Iterator<Element> it=eles.elementIterator();
c、properties 读取 键=值
eg://初始化工具类
Properties p=new Properties();
//读取文件
BufferedReader br=new BufferedReader(new FileReader("demo.properties"));
//加载流
p.load(br);
//读取
Set<String> itSet= p.stringPropertyNames();
Iterator<String> it=itSet.iterator();
while (it.hasNext()) {
String key=it.next();
System.out.println("key="+key+"---"+"value="+p.getProperty(key));
}