Reflection

反射能在运行时获取一个类的全部信息,并且可以调用类方法,修改类属性,创建类实例。

而在编译期间不用关心对象是谁

反射可用在动态代理,注解解释,和反射工厂等地方。

---------------------

public class BasicTest {

    public static void main(String[] args) throws Exception {

        Demo demo = new Demo(10,"moss");

        // 所有类的对象都是Class的实例
Class<?> clazz = null;
Class<?> clazz2 = null; //获取类对象
clazz = Class.forName("demos.reflection.Demo");
clazz2 = Demo.class;
clazz2 = demo.getClass();
Q.p(clazz.getClass());
Q.p(clazz==clazz2); // 使用默认构造函数 创建一个新的实例
demo = (Demo) clazz.newInstance();
demo.me(); //获取所有public的构造函数
Constructor<?>[] con =clazz2.getConstructors();
Q.pl(con); //使用自定义构造函数 创建一个新的实例
demo=(Demo) con[1].newInstance(100,"jack");
demo.me(); //获取超类 接口
Q.p(clazz.getSuperclass());
Q.pl(clazz.getInterfaces()); //获取所有属性,不包括继承的
Field[] fields = clazz.getDeclaredFields();
Q.pl(fields); //获取无参函数,调用无参函数
Method method=clazz.getMethod("me");
Q.p("method "+method);
method.invoke(clazz.newInstance()); //获取有参函数,调用有参函数
method = clazz.getDeclaredMethod("you", int.class,String.class);
Q.p("method2 "+method);
method.invoke(clazz.newInstance(), 19, "you"); //获取所有方法,不包括父类的, 可通过getMethods()获取全部的
Method[] methods = clazz.getDeclaredMethods();
Q.pl(methods); //给属性赋值
Field field = clazz.getDeclaredField("name");
field.setAccessible(true);
field.set(demo, "reSetName");
Q.p(demo.getName()); //获取注解
method = clazz.getMethod("toString");
Annotation[] as = method.getDeclaredAnnotations();
Q.pl(as);
}
}
class Father{
protected String father;
} interface Interface{} public class Demo extends Father implements Interface{ private static String k = "k"; private Integer id; private String name; Demo(){} public Demo(String name){
this.name=name;
} public Demo(int id, String name){
this.id=id;
this.name=name;
} public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public void me() {
Q.p("["+id+"----"+name+"]");
} public void you(int id, String name){
Q.p("["+id+"----"+name+"]");
} @Override
public String toString(){
return "["+id+"----"+name+"]";
} }

---------------------

end

Java基础--反射Reflection的更多相关文章

  1. Java基础-反射(reflect)技术详解

    Java基础-反射(reflect)技术详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.类加载器 1>.JVM 类加载机制  如下图所示,JVM类加载机制分为五个部分 ...

  2. Java基础——反射

    今天学到Java基础中的反反射.依照我学习后的个人理解呢,反射就是一套获取类.属性.方法等的工具吧.(其实,感觉学完反射后,有点像喝凉水,解渴但确实我也没体会出它有什么味道,我可能没有学到精髓吧.自己 ...

  3. Java基础—反射与代理(新手向)

    第1章 反射与代理 1.1 反射定义 一般情况下,需要一个功能的前提是遇到了某个问题,这里先列举一些问题,然后再通过反射是如何解决了这些问题,来引出反射的定义. 普通开发人员工作中最常见的问题:需要生 ...

  4. Java基础——反射 reflect

    什么是反射 (1)Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称 ...

  5. Java基础反射(二)

    原文地址http://blog.csdn.net/sinat_38259539/article/details/71799078 反射是框架设计的灵魂 (使用的前提条件:必须先得到代表的字节码的Cla ...

  6. JAVA基础-反射机制

    什么是JAVA的反射机制 Java反射是Java被视为动态(或准动态)语言的一个关键性质.这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其 ...

  7. java基础(反射,注解,多线程,juc)

    JAVA基础 java反射 class对象 三种方式获取class加载时对象 1.class.forName("全类名"):将字节码文件加载进内存,返回class对象 2.类名.c ...

  8. [java 基础]反射入门

    原文 概况 使用java的反射,可以让我们检查(或者修改)类,接口,字段,方法的特性.当你在编译期不知道他们的名字的时候非常有用. 除此之外,可以使用反射来创建实例,调用方法或者get/set 字段值 ...

  9. java基础-反射(细节)

    java面试题--java反射机制? Java反射机制的作用:1)在运行时判断任意一个对象所属的类.2)在运行时判断任意一个类所具有的成员变量和方法.3)在运行时任意调用一个对象的方法4)在运行时构造 ...

随机推荐

  1. Spring-data-jpa常用方法

  2. WebUploader API文档

    Web Uploader内部类的详细说明,以下提及的功能类,都可以在WebUploader这个变量中访问到. As you know, Web Uploader的每个文件都是用过AMD规范中的defi ...

  3. (转)Nova中的compute_node

    如需转载,请标明原文出处以及作者 陈锐 RuiChen @kiwik *2015/2/4 22:44:22 * 写在最前面: 这段时间连续改了几个scheduler和resource_tracker相 ...

  4. eclipse下进行c开发,使用zeromq

    使用eclipse开发代码,一段zeromq的代码. #include <string.h> #include <stdio.h> #include <unistd.h& ...

  5. 从性能的角度谈SQL Server聚集索引键的选择

      简介 在SQL Server中,数据是按页进行存放的.而为表加上聚集索引后,SQL Server对于数据的查找就是按照聚集索引的列作为关键字进行了.因此对于聚集索引的选择对性能的影响就变得十分重要 ...

  6. sorket is closed

    今早来公司启动项目时,发现在代码正确的情况下报了一个错. 15:19:14.362 [http-9000-2] ERROR com.nari.osp.servicebus.rmi.LongConnec ...

  7. ControlTemplate,ItemsPanelTemplate,DataTemplate(wpf)

    在WPF中有三大模板ControlTemplate,ItemsPanelTemplate,DataTemplate.其中ControlTemplate和ItemsPanelTemplate是控件模板, ...

  8. linux服务器应用NTP配置时间同步

    linux服务器应用NTP配置时间同步 • 为什么建议使用ntpd而不是ntpdate? #####原因很简单,ntpd是步进式的逐渐调整时间,而ntpdate是断点更新,比如现在服务器时间是9.18 ...

  9. hdu 1846 Brave Game(bash)

    Brave Game Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  10. 剑指offer--13.二进制中1的个数

    就是猜测试数据没有负数,哈哈 ----------------------------------------------------------------- 时间限制:1秒 空间限制:32768K ...