JAVA_SE基础知识——反射、内部类、配置文件(json,xml,properties)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_43841301/article/details/101066018

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));
	}

猜你喜欢

转载自blog.csdn.net/weixin_43841301/article/details/101066018