10、java反射机制

1、  什么是反射机制

正常情况下,我们通过类来创建对象。如果反过来,我们要通过一个对象来找到对应的类,怎么办,这时就要用到反射机制。

 

 

2、  java.lang.Class类

a)        Java中Object是所有类的父类,而Object类是java.lang.Class类的一个实例化对象,所以所有的类都是java.lang.Class类的实例化对象,java.lang.Class类是非常特殊的一个类,它是描述类的类

b)        java.lang.Class类的实例化对象(各个类)描述了各个类本身的整个结构,这也是反射机制的基础

c)        记住,所有类都是java.lang.Class类的对象

获取类名和类对象,如下

import java.util.Properties;

 

publicclass hello{

    publicstaticvoid main(String args[])throws Exception{

       

        Properties ps =new Properties();

        //获取类名

        System.out.println(ps.getClass().getName());

       

        //类对象的三种获取方式

        Class c1 = Class.forName("java.util.Properties");

        Class c2 =new Properties().getClass();

        Class c3 = Properties.class;

        System.out.println(c1.getName());

        System.out.println(c2.getName());

        System.out.println(c3.getName());

    }

}

 

 

3、  java.lang.Class类的使用

a)        Class对象来创建对象

b)        获取类结构,要获取类结构需要引用java.lang.reflect包,包括Constructor构造函数、Method方法、Field属性等

import java.lang.reflect.Constructor;

import java.lang.reflect.Method;

 

class Person{

    public String name;

    public Person(){}

    public Person(String name){this.name = name;}

}

 

publicclass hello{

    publicstaticvoid main(String args[])throws Exception{

       

        //创建Class类的Person类对象

        Class c1 = Class.forName("Person");

       

        //使用newInstanctce()方法来实例化Person类,此处调用的是无参构造函数

        Person p =(Person)c1.newInstance();

        p.name ="kaka";

        System.out.println(p.name);

       

        //获取Person类的构造函数列表

        Constructor cs[]= c1.getConstructors();

        for(Constructor c : cs){

            System.out.println(c);

        }

       

        //获取Person类的函数列表

        Method ms[]= c1.getMethods();

        for(Method m : ms){

            System.out.println(m);

        }

    }

}

 

 

4、  通过反射调用类中方法与属性等,invoke()

import java.lang.reflect.Method;

import java.lang.reflect.Field;

 

class Person{

    private String name;

    publicint age;

    public Person(){}

    public String getName(){returnthis.name;}

    publicvoid setName(String name){this.name = name;}

}

 

publicclass hello{

    publicstaticvoid main(String args[])throws Exception{

       

        //通过类名获取Person类对象

        //注意:使用Class泛型,否则报不安全错误

        Class c1 = Class.forName("Person");

        //获取Person的实例化对象

        Object obj = c1.newInstance();

       

        //获取Person类中的setName方法,该方法带一个String参数

        Method m1 = c1.getMethod("setName", String.class);

        //调用setName方法,需传入Person实例化对象,和参数

        m1.invoke(obj,"kaka");

       

        //获取Person类中的getName方法,该方法不带参数

        Method m2 = c1.getMethod("getName");

        //输出返回值

        System.out.println((String)m2.invoke(obj));

       

        //通过反射操作属性

        Field f1 = c1.getDeclaredField("age");

        f1.set(obj,100);

        System.out.println(f1.get(obj));

    }

}

 

 

5、  动态代理,没看懂,需要时再看吧

你可能感兴趣的:(java基础)