反射
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
如何创建类
//1.s.getClass()
Class clazz = s.getClass();
//2,Student.class
Class clazz = Student.class;
//3.Class.forName
//加载类:class文件加载到虚拟机(方法区)。 类加载会执行静态代码块里面的内容。
Class<Student> clazz = (Class<Student>) Class.forName("com.hp.seven01.Student") ;
//以 String 的形式返回此 Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称。
System.out.println(clazz.getName());
// //返回源代码中给出的底层类的简称。
System.out.println(clazz.getSimpleName());
//获取此类的包。
System.out.println(clazz.getPackage());
//返回此类或接口以整数编码的 Java 语言修饰符。
System.out.println(clazz.getModifiers());//1----public
// //返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的超类的 Class。
System.out.println(clazz.getSuperclass());
//这是调用无参的构造方法
Student s=(Student) clazz.newInstance();
//这是调用有参的构造方法
Constructor con = clazz.getConstructor(String.class,int.class);
Student s=(Student) con.newInstance("ss",1);
System.out.println(s);
//获取构造方法,然后遍历,只能遍历公共的能访问的构造方法,不能遍继承的构造方法
Constructor<Student> [] tors = clazz.getConstructors();
for (Constructor<Student> constructor : tors) {
System.out.println(constructor);
}
//获取构造方法,然后遍历,遍历公共的能访问的构造方法并且能遍历私有的方法,不能遍历继承的
Constructor<Student> [] tors =clazz.getDeclaredConstructors();
for (Constructor<Student> constructor : tors) {
System.out.println(constructor);
}
public static void main(String[] args) throws Exception {
Student s=new Student();
Class clazz=Class.forName("com.hp.index01.Student");
//获取属性,并且遍历公共能访问的属性,可以遍历继承过来的属性
// Field [] f1= clazz.getFields();
// for (Field field : f1) {
// System.out.println(field.getName());
// }
//获取本类的属性,不仅能遍历公共能访问的属性,而且可以遍历私有的属性,不能继承
// Field [] f2 = clazz.getDeclaredFields();
// for (Field field : f2) {
// System.out.println(field.getName());
// }
//因为Student中的name属性为私有的,需要用到getDeclaredField
Field name = clazz.getDeclaredField("name");
Field age=clazz.getField("age");
//这行代码用来给权限
name.setAccessible(true);
name.set(s,"ss");
age.setInt(s, 88);
System.out.println(name.get(s));
System.out.println(age.get(s));
}
public static void main(String[] args) throws Exception {
Student s=new Student();
Class clazz=Class.forName("com.hp.index01.Student");
//获取公开的方法,包括继承的
//Method m [] = clazz.getMethods();
//获取自己定义的方法,包括私有的
// Method m [] = clazz.getDeclaredMethods();
// for (Method method : m) {
// System.out.println(method);
// }
//此处method为方法名
Method ss= clazz.getDeclaredMethod("method", int.class,String.class);
ss.setAccessible(true);
System.out.println(ss.getName());
System.out.println();
ss.invoke(s, 520,"是金鱼耶");
}