20201018黄春跃

20201018黄春跃

知识点总结

反射

​ 反射(reflect)是java的特征之一,反射机制是建造框架技术的基础所在,灵活掌握java反射机制,对以后学习框架技术将有很大的帮助。

​ java的反射机制是指在运行状态中,动态获取类的信息(类的属性和方法)以及动态调用对象方法的功能。

java反射有三个动态性质

1.运行时生成对象实例。

2.运行期间调用方法。

3.运行时更改属性。

获取Class

  1. 可以通过 对象.getClass() 获取 Class 对象

     ```java
     Student stu = new Student();
    Class cla = stu.getClass();
    System.out.println(cla);//class com.ycdl.itlaobing.Student
    ```
  2. 类名.class 获取 Class 对象

     Class cla = Student.class;//通过类的class属性
     System.out.println(cla);//class com.ycdl.itlaobing.Student
    

getName()

System.out.println(cla.getName());//class com.ycdl.itlaobing.Student

获取Class对象中的信息

获取构造方法

Class cla = Student.class;
        try {
            //返回此Class对象的public构造方法
            
            //无参构造
            Constructor con = cla.getConstructor();
            System.out.println(con);//public com.ycdl.itlaobing.Student()
            //有参构造
            Constructor cons = cla.getConstructor(int.class,String.class,char.class);
            System.out.println(cons);
            //public com.ycdl.itlaobing.Student(int,java.lang.String,char)
        } catch (NoSuchMethodException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

方法

package com.ycdl.itlaobing;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Parameter;

public class Demo003 {
    public static void main(String[] args) {
        Class cla = Student.class;
        //获取所有public修饰的构造方法
        Constructor[] cons = cla.getConstructors();
        for (Constructor constructor : cons) {
            System.out.println(constructor);
        }
        System.out.println("======================");
        Constructor c = cons[0];
        System.out.println(c);
        //class java.lang.reflect.Constructor
        Class cla1 = c.getClass();
        System.out.println(cla1);
        
        // 获取访问修饰符 1 = public
        int cla2 = c.getModifiers();
        System.out.println(cla2);
        
        //获取构造方法所在类的名字 
        System.out.println(c.getName());
        
        //获取构造方法参数类型的个数
        int cla3 = c.getParameterCount();
        System.out.println(cla3);
        
        //获取构造方法参数
        Parameter[] cla4 = cons[1].getParameters();
        for (Parameter parameter : cla4) {
            System.out.println(parameter);
        }
        
        // 获取参数列表的类型
        Class[] cla5 = cons[1].getParameterTypes();
        for (Class class1 : cla5) { }
        
    }
}

package com.ycdl.itlaobing;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.Arrays;

public class Demo004 {
    public static void main(String[] args) {
        Class cla = Student.class;
        // 获取所有 public 修饰的构造方法
        Constructor[] cons = cla.getConstructors();
        for (Constructor constructor : cons) {
            System.out.println(constructor);
        }
        System.out.println("========================");
        //获取所有的构造方法
        Constructor[] cons1 = cla.getDeclaredConstructors();
        for (Constructor constructor : cons1) {
            System.out.println(constructor);
            System.out.println(constructor.getModifiers());
        }
        System.out.println("========================");
        //获取指定的构造方法
        try {
            Constructor<Student> c = cla.getDeclaredConstructor(int.class,String.class,char.class);
//          System.out.println(c);
            c.setAccessible(true);
            Student stu = c.newInstance(1,"abc",'男');
            System.out.println(c);
            System.out.println(stu);
        } catch (NoSuchMethodException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InstantiationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

package com.ycdl.itlaobing;

import java.lang.reflect.Method;

public class Demo005 {
    public static void main(String[] args) {
        Class cla = Student.class;
        
        try {
            // 获取 public 修饰的方法, 包含继承但未重写的指定方法
            Method m = cla.getMethod("eat", String.class);
            System.out.println(m);
            System.out.println("==========================");
            //获取所有的public修饰的方法
            Method[] method = cla.getMethods();
            for (Method method2 : method) {
                System.out.println(method2);
            }
            System.out.println("==========================");
            //访问类中声明的方法
            Method m1 = cla.getDeclaredMethod("test");
            System.out.println(m1);
            System.out.println("==========================");
            
            //访问类中声明的所有方法
            Method[] m2 = cla.getDeclaredMethods();
            for (Method method2 : m2) {
                System.out.println(method2);
            }
        } catch (NoSuchMethodException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

package com.ycdl.itlaobing;

import java.lang.annotation.Annotation;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;

public class Demo006 {

    public static void main(String[] args) {
        Class<Student> cla = Student.class;
        
        try {
            Method method = cla.getDeclaredMethod("study");
            System.out.println(method);
            // 访问修饰符 1 = public
            int mo = method.getModifiers();
            
            // 获取方法名字 toString
            String name = method.getName();
            // 获取方法的参数个数
            int count = method.getParameterCount();
            // 获取参数列表
            Parameter[] ps = method.getParameters();
            // 获取参数列表的类型
            Class[] pts = method.getParameterTypes();
            // 获取方法的返回值 如果没有返回值,此方法返回 void
            Class re = method.getReturnType();
            // 获取注解
            Annotation[] ans = method.getAnnotations();
            
            // 表示创建一个对象,调用无参构造
            Student stu = cla.newInstance();
            // 表示执行此方法,第一个参数表示执行方法的对象,第二个参数表示执行方法需要传的的参数
            Object reValue = method.invoke(stu);
            System.out.println(reValue);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        }
        
    }

}

总结

今天不上晚自习,回宿舍复习前面的基础。

标签

评论

this is is footer