反射机制

1.动态语言

C++,C,JAVA不是动态语言 JavaScript是一门动态语言
例如

function test(){
var s="var a=3;var b=5; alter(a+b);"
eval(s);
}

但是Java也具有一定的动态性

2.反射机制(reflection)

1.程序在运行的时候,可以动态的加载一个类,对于任何一个加载的类,都能够知道这个类的所有属性和方法,对于任何一个对象都能够调用这个类的方法和属性。

Class c=Class.forName(" 包+类名 ")
来自java.lang.Class

2.它可以将数组,接口,类等等各种放到一个Class对象里,通过这个对象可以调用类里面的数据。

3. Class对象的获取的三种方法

1.Class.forName();
2.类

3.类.getClass();
示例如下

public class reflection
{
    public static void main(String[] args)
    {
        String name="cn.sst.gao.Stu";
        try
        {
            Class src=Class.forName(name);  //一个类只能对应一个Class对象
            Class strClazz=String.class;
            Class src22=name.getClass();
            System.out.println(src.hashCode());     
            System.out.println(strClazz.hashCode());
            System.out.println(src22.hashCode());
            //对于数组是按维度 和类型进行分类的
            int[] p=new int[10];
            int[] s=new int[20];
            Class srcc=p.getClass();
            Class srcc1=s.getClass();
            System.out.println(srcc.hashCode());
            System.out.println(srcc1.hashCode());
        } catch (ClassNotFoundException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
    }
}
4. 通过反射返回类的信息

1.获取类的名字
getName
2.获取属性 -->Field -------需要先返回这个类型的对象 ---Class对象.

  • getFields 获取所有的Public类型的
  • getDeclaredFields 获取所有的Field
  • getDeclaredField(" 属性的名字") 获取某个属性名字的属性
    3.获取方法 --- >Method
  • getDeclaredMethods()得到所有的方法
  • getDeclaredMethod("getAge",null); 得到某个方法 1.传入方法的名字2,如果有参数则传入 类型.class对象
    4.构造器 --> Constructor()
  • getDeclaredConstructors() 得到所有的构造器
  • getDeclaredConstructor() 得到某个指定的构造器 需要传入参数(如上)
    5.获得注解 ---->SxtTable
    1.获得类的注解
  • Class对象.getAnnotations() 获得所有注解
  • Class对象.getAnnotation(名字.class)获得某个注解
    2.获得方法,属性的注解
  • 先获取属性,方法等
  • 方法如上
5.通过反射获得建立Class对象,并对其中的属性进行操作

1.获取Class对象的类的对象

  • 对象 p=Class对象.newInstance();

User p=(User) clazz.newInstance(); //调用了User的无参构造方法

  • 先建立构造器 再通过构造器进行创建

Constructor<User> c=clazz.getDeclaredConstructor(int.class,int.class,String.class);
User p1=c.newInstance(10001,18,"小风");

2.获取方法

  • .先获取方法 Method p=Class对象.getDeclaredMethod("方法名",参数);
  • method.invoke(对象, 参数);

User p2=(User) clazz.newInstance();
Method method=clazz.getDeclaredMethod("setId", int.class);
method.invoke(p2, 10);

3.获取属性

  • 先获取属性 Field p=Class对象.getDeclaredField("名字");
    --------如果是私有的 需要p.setAccessible(true);
  • f.set(p3,20);

User p3=(User) clazz.newInstance();
Field f=clazz.getDeclaredField("age");
f.setAccessible(true);
f.set(p3,20);
System.out.println(p3.getAge());

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 不论是 Java 开发 还是 Android 开发,反射、泛型、注解 都是架构设计中很重要的一个知识点。 为了更好...
    JamFF阅读 3,547评论 0 4
  • Idea提示我newInstance();被弃用了,我查了下,使用getDeclaredConstructor()...
    TowuaErio阅读 2,472评论 0 0
  • 一、概述 Java反射机制定义 Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类中的所有属性和方法...
    CoderZS阅读 5,556评论 0 26
  • 什么是java反射: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一...
    乐百事52淑熙阅读 2,732评论 0 0
  • 1.反射机制是什么: 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,...
    蛮大人我们走阅读 2,839评论 0 0

友情链接更多精彩内容