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. Python多线程循环

    背景:Python脚本:读取文件中每行,放入列表中:循环读取列表中的每个元素,并做处理操作. 核心:多线程处理单个for循环函数调用 模块:threading 第一部分:   :多线程脚本 (该脚本只 ...

  2. linux下安装eclipse并使用xstart远程使用(centos7)

    1 eclipse安装 1)到官网下载eclipse的linux版 http://www.eclipse.org/downloads/packages/eclipse-ide-java-ee-deve ...

  3. USB引脚及定义

    USB 2.0 USB接口定义: USB引脚定义: 针脚 名称 说明 接线颜色 1 VCC +5V电压 红色 2 D- 数据线负极 白色 3 D+ 数据线正极 绿色 4 GND 接地 黑色   Min ...

  4. HDFS-文件写入API

    package com.zhen.hdfs; import java.io.BufferedInputStream; import java.io.FileInputStream; import ja ...

  5. Caused by: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'company' in 'class java.lang.String'

    Caused by: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named ' ...

  6. elasticsearch中filter执行原理深度剖析(bitset机制与caching机制)

    (1)在倒排索引中查找搜索串,获取document list date来举例 word doc1 doc2 doc3 2017-01-01 * *2017-02-02  *   *2017-03-03 ...

  7. 从配置maven环境到maven项目的新建

    话不多说,直接入正题. 一.配置maven 环境 首先安装最新版支持javaee的eclipse.我这里下载的版本是eclipse-jee-mars-2-win32-x86_64的新版(我是2017年 ...

  8. flsk-SQLALchemy

    SQLALchemy 一.介绍     SQLALchemy是一个基于Python实现的ORM框架.该框架是建立在DB API之上,使用关系对象映射进行数据库操作     简言之便就是:将类和对象转换 ...

  9. json数据转换异常:net.sf.json.JSONException: java.lang.reflect.InvocationTargetException

    转:json数据转换异常:net.sf.json.JSONException: java.lang.reflect.InvocationTargetException 执行:JSONArray arr ...

  10. 机器学习(二十五)— 极大似然估计(MLE)、贝叶斯估计、最大后验概率估计(MAP)区别

    最大似然估计(Maximum likelihood estimation, 简称MLE)和最大后验概率估计(Maximum aposteriori estimation, 简称MAP)是很常用的两种参 ...