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

Reflection的更多相关文章

  1. Fresnel Reflection - 菲涅尔反射

    [Fresnel Reflection - 菲涅尔反射] “菲涅尔”是一个人的名字,因为他发现了一个有关反射的光学现象,这个现象就用这个人的名字命名了.那么,是什么现象呢? 这就是反射/折射与视点角度 ...

  2. CSharpGL(13)用GLSL实现点光源(point light)和平行光源(directional light)的漫反射(diffuse reflection)

    CSharpGL(13)用GLSL实现点光源(point light)和平行光源(directional light)的漫反射(diffuse reflection) 2016-08-13 由于CSh ...

  3. Scala Reflection - Mirrors,ClassTag,TypeTag and WeakTypeTag

    反射reflection是程序对自身的检查.验证甚至代码修改功能.反射可以通过它的Reify功能来实时自动构建生成静态的Scala实例如:类(class).方法(method).表达式(express ...

  4. [.net 面向对象程序设计进阶] (21) 反射(Reflection)(下)设计模式中利用反射解耦

    [.net 面向对象程序设计进阶] (21) 反射(Reflection)(下)设计模式中利用反射解耦 本节导读:上篇文章简单介绍了.NET面向对象中一个重要的技术反射的基本应用,它可以让我们动态的调 ...

  5. [.net 面向对象程序设计进阶] (20) 反射(Reflection)(上)利用反射技术实现动态编程

    [.net 面向对象程序设计进阶] (20) 反射(Reflection)(上)利用反射技术实现动态编程 本节导读:本节主要介绍什么是.NET反射特性,.NET反射能为我们做些什么,最后介绍几种常用的 ...

  6. Could not load type 'System.Reflection.AssemblySignatureKeyAttribute' from assembly 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c

    错误: Could not load type 'System.Reflection.AssemblySignatureKeyAttribute' from assembly 'mscorlib, V ...

  7. 代替Reflection(反射)的一些方法

    Reflection(反射)是深入学习.Net必须掌握的技能之一.最初学Reflection的时候,的确是被惊住了,原来还可以这样.只要给你一个Assembly, 你就能获取到其中所有的类型,根据类型 ...

  8. Leetcode: Line Reflection

    Given n points on a 2D plane, find if there is such a line parallel to y-axis that reflect the given ...

  9. 反射(Reflection)

    反射主要用于在程序运行期间动态解析相关类的类名,命名空间,属性,方法并进行相应操作,以下通过两个简单的例子进行了说明: 示例1:调用程序集内部方法,运行时动态获取相关类的信息,包括类名,命名空间等信息 ...

  10. 异常:“System.Reflection.Metadata”已拥有为“System.Collections.Immutable”定义的依赖项

    参考动态执行T4模板:https://msdn.microsoft.com/zh-cn/library/bb126579.aspx 我项目是.NET Framework 4.5控制台应用程序写的. 执 ...

随机推荐

  1. ajaxfileupload.js支持多文件上传【转载】

    //修改前代码------- //var oldElement = jQuery('#' + fileElementId); //var newElement = jQuery(oldElement) ...

  2. MVC概念性的内容

    MVC:    是一个缩写(model + view + control),      Model:是一些类文件,  功能:负责增删改查, 负责跟数据库打交道 (把数据存入到数据库: 从数据库把数据读 ...

  3. BZOJ4448:[SCO2015]情报传递

    题目大意:给你一棵树,有两种操作,一个是修改某个点的权值,另一个是询问两点之间的距离以及路径上小于某个值的数的个数. 询问两点之间距离直接lca即可,对于求个数的问题可以用主席树完成. #includ ...

  4. EL表达式与JSTL

    内容包括 EL表达式 EL函数库 JSTL 核心标签库 格式化标签库 SQL标签库 XML标签库 自定义标签库 EL表达式 EL是Expression Language的是缩写,是JSP页面编写的一种 ...

  5. 使用 readfile() 下载文件

    下载图片 <?php $file = 'monkey.gif'; if (file_exists($file)) { header('Content-Description: File Tran ...

  6. JS中的String.Math.Date

    //今天放假没看东西,贴上以前的基础,没事看着玩 // String->-> var myStr = "My name is LiuYashion"; console. ...

  7. momentjs 求小时差异

    momentjs  使用 var now1 = moment( moment().unix()*1000); //获取unix时间戳 需要*1000 var befor_time = moment(1 ...

  8. Javascript模块化编程(一):模块的写法 作者: 阮一峰

    声明:转载自阮一峰的网络日志 随着网站逐渐变成"互联网应用程序",嵌入网页的Javascript代码越来越庞大,越来越复杂. 网页越来越像桌面程序,需要一个团队分工协作.进度管理. ...

  9. 利用vs2013简单初探Python

    最近无聊,某天无意在vs2013上发现了Python...... Python介绍:可以自己搜索一下. 接下来,准备工具: Win7搭建开发环境.需要准备Python.PTVS2013. 1.http ...

  10. Java多线程 LockSupport

    在AQS里面进行阻塞线程,解除阻塞线程就用的LockSupport. JDK1.8源码: package java.util.concurrent.locks; import sun.misc.Uns ...