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<User>
c1=class1.getDeclaredConstructor(String.class,int.class,String.class);
User user=c1.newInstance("jax",11,"male");
//无参的构造函数
/*
Constructor<User>c2=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());//查到根节点
List<Element>list=root.elements("user");//获取所有叫user的节点
for(Element element:list){
List<Element>list2=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();