java---反射机制(重要)

网上将了很多反射的概念,理论的东西很难吃透,不如直接上代码。

不过有一点是得重视的,反射是框架设计的灵魂

跟着写一遍代码才算真会

一、新建类

package reflection;
public class Person {
    private String name = "Tom";
    //公有属性
    public int age = 18;
    public Person(){}
    private void say(){
        System.out.println("private say()...");
    }
     //公有方法
    public void work(){
        System.out.println("public work()...");
    }
}

通过反射获得该类,三种方法,只有第三种用比较多。

package reflection;
public class Reflection {
    public static void main(String[] args) throws ClassNotFoundException {
        //方法1,通过对象调用 getClass() 方法来获取,通常应用在:比如你传过来一个 Objec
        Person person = new Person();
        Class c1 = person.getClass();
        System.out.println(c1);

        //方法2,直接通过 类名.class 的方式得到,该方法最为安全可靠,程序性能更高
        Class c2 = Person.class;
        System.out.println(c2);

        //方法三,用最多的,可以加配置文件的,通过 Class 对象的 forName() 静态方法来获取,用的最多
        Class c3 = Class.forName("reflection.Person");
        System.out.println(c3);
    }
}

第2,通过c3类获取成员变量、成员方法、接口、超类、构造方法等

查阅 API 可以看到 Class 有很多方法:

  getName():获得类的完整名字。
  getFields():获得类的public类型的属性。
  getDeclaredFields():获得类的所有属性。包括private 声明的和继承类
  getMethods():获得类的public类型的方法。
  getDeclaredMethods():获得类的所有方法。包括private 声明的和继承类
  getMethod(String name, Class[] parameterTypes):获得类的特定方法,name参数指定方法的名字,parameterTypes 参数指定方法的参数类型。
  getConstructors():获得类的public类型的构造方法。
  getConstructor(Class[] parameterTypes):获得类的特定构造方法,parameterTypes 参数指定构造方法的参数类型。

  newInstance():通过类的不带参数的构造方法创建这个类的一个对象。

具体代码说明在文章末尾。

灵活使用反射能让我们代码更加灵活,这里比如JDBC原生代码注册驱动,hibernate 的实体类,Spring 的 AOP等等都有反射的实现。但是凡事都有两面性,反射也会让增加系统的性能,复杂性等,合理使用才是真!

package reflection;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/*
 *Created by William on 2018/3/16 0016
 */
public class Reflection {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException {
        //方法三,用最多的,可以加配置文件的,通过 Class 对象的 forName() 静态方法来获取,用的最多
        Class c3 = Class.forName("reflection.Person");
        System.out.println(c3.getName());//输出reflection.Person

        //获得类的public类型的属性
        Field[] fields = c3.getFields();
        for(Field field:fields){
            System.out.println(field);    //输出public int reflection.Person.age
        }

        //获得类的所有属性。包括私有的和继承类的
        Field[] declaredFields = c3.getDeclaredFields();
        for(Field field:declaredFields){
            System.out.println(field);
            //输出private java.lang.String reflection.Person.name
            //输出public int reflection.Person.age
        }
        //获得类的public类型的方法。这里包括 Object 类的一些方法
        Method[] methods = c3.getMethods();
        for(Method method:methods){
            System.out.println(method);
            /**输出
            public void reflection.Person.work()
            public final void java.lang.Object.wait() throws java.lang.InterruptedException
            public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
            public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
            public boolean java.lang.Object.equals(java.lang.Object)
            public java.lang.String java.lang.Object.toString()
            public native int java.lang.Object.hashCode()
            public final native java.lang.Class java.lang.Object.getClass()
            public final native void java.lang.Object.notify()
            public final native void java.lang.Object.notifyAll()*/
            //获得类的所有方法。
            Method[] declaredMethods = c3.getDeclaredMethods();
            for(Method method1:declaredMethods){
                System.out.println(method1);
                //输出private void reflection.Person.say()
                //public void reflection.Person.work()
            }
            //获得指定的属性
            Field f1 = c3.getField("age");
            System.out.println(f1);//输出public int reflection.Person.age
            //获得指定的私有属性
            Field name = c3.getDeclaredField("name");
            System.out.println(name);//private java.lang.String reflection.Person.name
            //启用和禁用访问安全检查的开关,值为 true,则表示反射的对象在使用时应该取消 java 语言的访问检查;反之不取消
            name.setAccessible(false);
            //创建这个类的一个对象
            try {
                Object newInstance = c3.newInstance();
//                name.set(newInstance,"boduo");
                //使用反射机制可以打破封装性,导致了java对象的属性不安全。
//                System.out.println(name.getName());
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
            //获取构造方法
            Constructor[] constructors = c3.getConstructors();
            for(Constructor constructor:constructors){
                System.out.println(constructor);//public reflection.Person()
            }
        }
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值