An apple of discord

1、反射

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法,所以先要获取到每一个字节码文件对应的Class类型的对象。

一句话概括:反射就是把java类中的各种成分映射成相应的java类(Class,Field,Method,Constructor),在程序运行的过程中,动态的访问java类中的成分,反射还可以实现框架的功能

三种获取Class对象的方式

1、将类名作为字符串传递给Class类中的静态方法forName即可

 Class c3 = Class.forName("Person");

2、数据类型的静态属性class

Class c2 =Person.class;

3、Object类的getClass()方法

 Person p = new Person();
 Class c = p.getClass();

获取成员变量

  • getField(String name) 获取父类和本类一个变量(公有)
  • getFields() 获取父类和本类所有变量(公有)
  • getDeclaredField(String name) 获取一个本类变量(无论公有私有)
  • getDeclaredFields() 获取本类所有变量(无论公有私有)

获取成员方法

  • getMethod(String name)获取一个父类和本类具体的方法(公有)
  • getDeclaredMethod(“方法名”String name) 获取本类所有的方法(无论公有私有)
  • getMethods() 获取父类和本类所有方法(公有)
  • getDeclaredMethods() 获取本类所有的方法(无论公有私有)

获取构造方法

  • getConstructor() 获取父类和本类指定构造方法(公有)
  • getDeclaredConstructor() 获取本类指定的构造方法(无论公有私有)
  • getConstructors() 获取本类和父类所有公有的构造方法
  • getDeclaredConstructors() 获取本类所有的构造方法

实例化

//有参的构造函数
Class class1=User.class;
Constructor
c1=class1.getDeclaredConstructor(String.class,int.class,String.class);  
User user=c1.newInstance("jax",11,"male");
//无参的构造函数
/*
Constructorc2=class1.getDeclaredConstructor();
User user=c2.newInstance(); 
*/
Object user2= class1.newInstance();//可以直接通过class创对象
Class class2=user2.getClass();
Field field=class2.getDeclaredField("name");
field.setAccessible(true);//当是私有的时候要设置路径
field.set(user2, "martin");//为具体属性赋值
Method me=class2.getDeclaredMethod("方法名",String.class);
me.setAccessible(true);
me.invoke(user2,"String参数");

小练习


2、XML

一、查

SAXReader reader = new SAXReader();
Document document=reader.read(new File("user.xml"));
Element root=document.getRootElement();
System.out.print(root.getName());//查到根节点
Listlist=root.elements("user");//获取所有叫user的节点
for(Element element:list){
    Listlist2=element.elements();//user下面所有节点
for(elements:list2){
syso(elements.getText());//用getText()方法获取节点内容

}
}//遍历list获得下面




二、保存

SAXReader reader = new SAXReader();
Document document=reader.read(new File("user.xml"));
XMLWriter writer = new XMLWriter(new FileOutputStream("user1.xml"));
writer.write(document);//写入
writer.close();//关闭资源

三、增

SAXReader reader = new SAXReader();
Document document = reader.read(new File("user.xml"));
Element root=document.getRootElement();
Element username=root.addElement("username");
username.setText("jax");//为新增节点赋值
Element password=root.addElement("password");
username.setText("123");//为新增节点赋值

OutputFormat format=OutputFormat.createPrettyPrint();//设置一个漂亮的格式
format.setEncoding("utf-8");//设置编码格式
//后面就是前面提到的保存环节
XMLWriter writer=new XMLWriter(new FileOutputStream("user.xml"));
writer.write(document);
writer.close();

你可能感兴趣的:(An apple of discord)