java反射机制

来源:互联网 发布:linux菜鸟私房菜 编辑:程序博客网 时间:2024/06/10 20:05

java.lang.Class 类是Java中的反射中心。
Class类的一个对象表示运行时程序中的一个类。

1、所以实例化Class类的方式有点特殊,有三种方式获取类的Class对象的引用:
- 使用类文字
- 使用Object类的getClass()方法
- 使用Class类的forName()方法

    //getClass()                String str="hello";                Class<?> cls=str.getClass();                System.out.println(cls);    //包.类.class                     Class<?> cls1=java.lang.String.class;                System.out.println(cls1);    //类不确定的情况下实例化Class,forName()更具灵活性            Class<?> cls2=Class.forName("java.lang.String");            System.out.println(cls2);

运行结果

class java.lang.Stringclass java.lang.Stringclass java.lang.String

2、反射实例化Class对象
注:反射存在很多异常,此处有省略一些异常处理
- 无参数实例化

class MClass {      public MClass() {         System.out.println("调用类初始化对象");      }}public class Test{      public static void main(String[] args) throws InstantiationException {        Class<?> c = null;        try {            c = Class.forName("fanshe.MClass");        } catch (ClassNotFoundException e) {            e.printStackTrace();        }                   try {      //将构造好的对象向下转型为MClass类,newInstance()方法会抛异常          MClass p = (MClass) c.newInstance();          System.out.println(p);        } catch (InstantiationException | IllegalAccessException e) {          System.out.println(e.getMessage());        }      }}
  • 有参数实例化
class MyClass {      public MyClass(int i, String s) {        System.out.println("对象初始化");        System.out.println("参数   "+i+" "+s);      }}public class Test {      public static void main(String[] args) {            Class<?> Cls =null;            try {                Cls = Class.forName("fanshe.MyClass");            } catch (ClassNotFoundException e) {                e.printStackTrace();            }            try {               //获得Class类对象的有参构造方法,括号里面参数的写法是:类型.class              Constructor<MyClass> cons = (Constructor<MyClass>) Cls.getConstructor(int.class,String.class);              //用此构造方法构造一个新的MyClass对象给myCls              MyClass myCls = cons.newInstance(1, "abc");              System.out.println(myCls);            } catch (NoSuchMethodException | SecurityException | InstantiationException                | IllegalAccessException | IllegalArgumentException                | InvocationTargetException e) {              System.out.println(e.getMessage());            }     }}

3、利用反射机制获取类结构

  • 获取类的构造方法
class Persons{    private int n;    public Persons(){           }    public Persons(int n){        this.n=n;    }}public class Test{    public static void main(String[] args) {        Class<?> c2 = null;        try {            c2 = Class.forName("fanshe.Persons");        } catch (ClassNotFoundException e) {            e.printStackTrace();        }        //这里的getConstructors()方法返回的是一个Constructor数组        Constructor<?>[] cons = c2.getConstructors();        //打印的方式你可以自己写,为了方便我用Arrays.toString(),凑合着看        System.out.println(Arrays.toString(cons));    }}
  • 获取类实现的接口
public interface Student {   public void study();}//-----------------------------class Persons implements Student{       public void study() {        System.out.println("学习使我快乐");    }}public class Test{    public static void main(String[] args) {        Class<?> cls = null;        try {            cls = Class.forName("fanshe.Persons");        } catch (ClassNotFoundException e) {            e.printStackTrace();        }        Class<?>[] in = cls.getInterfaces();        System.out.println(Arrays.toString(in));    }}
运行结果:[interface fanshe.Student]
  • 获取父类:java中是单继承,父类只有一个
class Persons{    public void study(){            }}class Student extends Persons {     public void study() {        System.out.println("学习使我快乐");    }}public class Test{    public static void main(String[] args) {        Class<?> cls = null;        try {            cls = Class.forName("fanshe.Student");        } catch (ClassNotFoundException e) {            e.printStackTrace();        }        Class<?> su = cls.getSuperclass();        System.out.println(su);    }}

运行结果

class fanshe.Persons
  • 获取类的全部方法
//获取类的全部方法class Persons{    public void music(){        System.out.println("Me and You");    }    public void dance(){        System.out.println("forever");    }}public class Test{    public static void main(String[] args) {        Class<?> cls = null;        try {            cls = Class.forName("fanshe.Persons");        } catch (ClassNotFoundException e) {            e.printStackTrace();        }        Method[] m = cls.getMethods();        for (int i = 0; i < m.length; i++) {            System.out.println(m[i]);        }    }}

结果

public void fanshe.Persons.music()public void fanshe.Persons.dance()public final void java.lang.Object.wait() throws java.lang.InterruptedExceptionpublic final void java.lang.Object.wait(long,int) throws java.lang.InterruptedExceptionpublic final native void java.lang.Object.wait(long) throws java.lang.InterruptedException......
  • 取得本类的全部属性
class Persons{    private int num;    private String name;}public class Test{    public static void main(String[] args) {        Class<?> cls = null;        try {            cls = Class.forName("fanshe.Persons");        } catch (ClassNotFoundException e) {            e.printStackTrace();        }        //取得本类的全部属性        Field[] f = cls.getDeclaredFields();        for (int i = 0; i < f.length; i++) {            System.out.println(f[i]);        }    }}

获取属性对应的值

class Person {      public String name;    private int age;        public Person(String name, int age) {        this.name = name;        this.age = age;    }}public class Refect {    public static void main(String[] args) throws ClassNotFoundException,...{            Person  p= new Person("link",20);            Class<?> cls= p.getClass();            //获取公共属性的值,get(p)表明要获取是哪个对象的值            Field f2 = cls.getField("name");            String nam = (String) f2.get(p);            System.out.println("姓名: " + nam);            //setAccessible()方法可以设置是否访问和修改私有属性,age是私有属性设为true            //获取私有属性的值            Field f3 = cls.getDeclaredField("age");            f3.setAccessible(true);            int age = (int) f3.get(p);            System.out.println("年龄: " + age);    }}

结果

姓名: link年龄: 20
  • 反射调用方法
class Pers{    public void num(int n) {        System.out.println(n);    }    public static void use(String str) {        System.out.println(str);    }}public class Fs {     public static void main(String[] args) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {         Pers p = new Pers();         Class<?> c = p.getClass();         //getMethod()方法需要传入方法名,和参数类型         Method m1 = c.getMethod("num", int.class);         //invoke()表示调用的意思,需要传入对象和参数         m1.invoke(p, 10);         Method m2 = c.getMethod("use", String.class);         //这里的null表示不由对象调用,也就是静态方法         m2.invoke(null, "工具");    }}
原创粉丝点击