【2019春招准备:27.反射】

https://www.cnblogs.com/ysocean/p/6516248.html
动态语言:动态类型语言,是指数据类型的检查是在运行时做的。用动态类型语言编程时,不用给变量指定数据类型,该语言会在你第一次赋值给变量时,在内部记录数据类型。Perl,Python,Ruby
静态类型:是指数据类型的检查是在运行前(如编译阶段)做的。C++,Java,C#

但同时:java因为他的反射机制被视为准动态语言:

  • 对于任意一个类,都能够知道这个类的所有属性和方法
  • 对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性

代码可以在运行时装配,无需在组件之间进行源代码链接,降低代码的耦合度;还有动态代理的实现等等;但是需要注意的是反射使用不当会造成很高的资源消耗!

1.获取Class类的三种方式

对象.getclass
类.class (静态成员变量)
Class.forname(“完整类名”)

2. Class类获取到之后 有什么用(API)

在这里插入图片描述
https://blog.csdn.net/qq_32165041/article/details/82709260

Field( java.lang.reflect.Field)

Method(java.lang.reflect.Method)

3.根据反射获取父类的private方法

package p1_reflect.pp2_getBasePrivate;

import java.lang.reflect.Field;

public class Test_getFatherPrivate {

    public static Field getDeclaredField(Object obj,String fieldName){
        Field field=null;
        Class c = obj.getClass();
        for(;c!=Object.class;c=c.getSuperclass()){
            try{
                field=c.getDeclaredField(fieldName);
                field.setAccessible(true);
                return field;
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
            }
        }
        return field;
    }


    public static Object getFieldValue(Object object,String fieldName) throws IllegalAccessException {
        Field field = getDeclaredField(object, fieldName);
        return field.get(object);
    }


    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
        Class c1 = Class.forName("p1_reflect.pp2_getBasePrivate.Son");

        System.out.println(getFieldValue(c1.newInstance(),"privateString"));
    }




}

4. 补充

反射破坏代码的封装性,破坏原有的访问修饰符访问限制

猜你喜欢

转载自blog.csdn.net/qq_33907408/article/details/86775079