美文网首页
java学习第八天

java学习第八天

作者: toro宇 | 来源:发表于2020-01-16 14:13 被阅读0次

反射

Persion p = new Persion();
Class clazz = p.getClass(); // clazz对象中就包含对象p所属的Persion类的所有信息
    
Class c0 = Persion.class; // 通过类名.class创建指定类的Class实例
Class c1 = p.getClass();
try {
        // 通过Class的静态方法forName(String className)来获取一个类的Class实例
        // forName(String className)方法中国参数是你要获取Class实例的类的全路径(包名.类名)
        Class c2 = Class.forName("day13.Persion"); // 这个是获取Class实例的常用方式
    } catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } 
// move接口
public interface Move {
   void move();
}
// study接口
public interface Study {
void studyInfo();
}
 // persion父类
public class Persion {
String name;
int age;

}
// student子类
public class Student extends Persion implements Move,Study{
public Student() {  
    System.out.println("调用的是:Student()");

}

public Student(String school) {
    this.school = school;
    System.out.println("调用的是:Student(String school)");

}

private Student(String school, int age) {
    this.school = school;
    this.age = age;
    System.out.println("调用的是: Student(String school, int age)");

}


public String school;
private String privateField;

public void showInfo() {
    System.out.println("学校是:" + this.school);
}
    
@Override
public void studyInfo() {
    // TODO Auto-generated method stub
    System.out.println("学习知识");
}

@Override
public void move() {
    // TODO Auto-generated method stub
    System.out.println("骑自行车上学");
}
   private void test(String name) {
    
    
}
public String getSchool() {
    return this.school;
}
}
try {
        Class clazz = Class.forName("day13.Student");// 获取Student类的Class结构实例
        
        Class superClazz =  clazz.getSuperclass();// 获取父类的Class结构实例
        System.out.println(superClazz.getName());// day13.Persion
        
        Class[] interfaces = clazz.getInterfaces(); // 获取当前类的所有接口
        for(Class c : interfaces) {
            System.out.println(c.getName());
            // day13.Move
            // day13.Study
        }
    } catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
Constructor[] cons = clazz.getConstructors();// 获取类的公有的构造方法 返回数字1代表public 
        for(Constructor c : cons) {
            System.out.println("构造方法名称" + c.getName()); // 获取方法名称
            System.out.println("构造方法名称" + c.getName() + "的修饰符是:" + c.getModifiers() ); // 获取方法的修饰符
            // 构造方法名称day13.Student的修饰符是:1
            
            Class[]paramClazz = c.getParameterTypes();
            for(Class pc : paramClazz) {
                System.out.println("构造方法名称" + c.getName() + "的参数类型是: " + pc.getName() ); // 获取方法名称
                // 构造方法名称day13.Student的参数类型是: java.lang.String

            }
        }
        
        Constructor[] cons1 = clazz.getDeclaredConstructors(); // 返回类的所有构造方法(包括公有,私有),返回数字2代表private.
        for(Constructor c : cons1) {
            System.out.println("构造方法名称" + c.getName()); // 获取方法名称
            System.out.println("构造方法名称" + c.getName() + "的修饰符是:" + c.getModifiers() ); 
        // 构造方法名称day13.Student的修饰符是:2

            Class[]paramClazz = c.getParameterTypes();
            for(Class pc : paramClazz) {
                System.out.println("构造方法名称" + c.getName() + "的参数类型是: " + pc.getName() ); // 获取方法名称
              // 构造方法名称day13.Student的参数类型是: java.lang.String
             // 构造方法名称day13.Student的参数类型是: int

            }
        }


// 如何用反射的构造方法来创建对象
        
        try { 
        Object obj = clazz.newInstance(); // 相当于调用Student类的无参共有的构造方法
        Student stu = (Student)obj; // 调用的是:Student()
         
        Constructor c = clazz.getConstructor(String.class);// 指定获取一个参数并且为String类型的共有的构造方法
        Student stu1 =  (Student)c.newInstance("第一中学");
        // 调用的是:Student(String school)
        System.out.println(stu1.school);
//          // 第一中学 
        
        //通过反射机制,可以强制的调用私有的构造方法。
        
       Constructor c1 =  clazz.getDeclaredConstructor(String.class,int.class);// 指定获取两个参数的构造方法
       c1.setAccessible(true);// 接触私有的封装 
       // 如果没有解除封装直接调用会报异常: 私有方法不可调用 
       // java.lang.IllegalAccessException: Class day13.Test1 can not access a member of class day13.Student with modifiers "private"

       Student stu2 =  (Student)c1.newInstance("zhangsan",12);
        System.out.println(stu2.school + stu.age);

        } catch(Exception e) {
            e.printStackTrace();
        }
//          Method[] ms = clazz.getMethods(); // 获取类的所有的公有方法
        Method[] ms = clazz.getDeclaredMethods();// 获取类的所有方法包括公有,私有
        for(Method m : ms) {
        System.out.println("方法名:" + m.getName());
        //
        System.out.println("返回值类型:" + m.getReturnType());
        System.out.println("修饰符:" + m.getModifiers());
        
        Class[] pcs = m.getParameterTypes(); // 获取方法的参数类型,是一个数组,参数有几个,数组内元素个数就有几个
        for(Class pc : pcs) {
            System.out.println("参数类型:" + pc.getName());
        }
        }
方法名:test
返回值类型:void
修饰符:2
参数类型:java.lang.String
Field[] fs = clazz.getFields();// 获取类的public属性,包含父类
Field[] fs = clazz.getDeclaredFields();// 获取类的所有属性,本类
for(Field f : fs) {
 System.out.println("修饰符:"+ f.getModifiers());
 System.out.println("属性的类型" + f.getType());
System.out.println("属性的名称:" + f.getName());
}

 ///////
 Package p = clazz.getPackage();// 获取类所在的包
System.out.println(p.getName()); // day13
    // 得到名称是 setInfo ,参数类型是 String,String 的方法
    Method m = clazz.getMethod("setInfo", String.class, String.class);
    
    Constructor con = clazz.getConstructor();// 获取无参构造
    Object obj = con.newInstance();// 使用无参构造创建对象
    
    m.invoke(obj, "zhangsan","第一中学");// 参数1是需要实例化的对象,后面的参数是当前调用发放的实际参数
    // 这个是setInfo(String name,String school方法
    
    // 如果想要调用一个私有方法
    Method m1 = clazz.getDeclaredMethod("test", String.class); // 
    m1.setAccessible(true); // 解除私有封装,下面可以强制调用私有的方法
    m1.invoke(obj, "李四");
    // 这是私有test(String name)方法
    
    // 有返回值的方法
    Method m3 = clazz.getMethod("getSchool");// 获取方法名为getSchool并且没有参数的方法
    String school = (String)m3.invoke(obj);// 调用有返回值得但是没有参数的方法
        // 反射创建一个对象
        Constructor con = clazz.getConstructor();
        Student stu = (Student)con.newInstance();
        
        Field f = clazz.getField("school");// 获取名称为school的属性
        
        f.set(stu, "第三中学");
        String school = (String)f.get(stu); // 获取stu对象的school属性的值
        System.out.println(school); 
    
        // 如果是私有属性
        Field f1 = clazz.getDeclaredField("privateField");
        f1.setAccessible(true);// 私有属性,显示操作后,才可操作;
        
        f1.set(stu, "测试私有属性");
        System.out.println(f1.get(stu));

相关文章

网友评论

      本文标题:java学习第八天

      本文链接:https://www.haomeiwen.com/subject/uagtzctx.html