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. php 代码优化提高MySQl的运行效率

    [mysqld] log="d:/temp/mysql.log" log_slow_queries="d:/temp/mysql_slow.log" long_ ...

  2. window下从python开始安装科学计算环境

    Numpy等Python科学计算包的安装与配置 参考: 1.下载并安装 http://www.jb51.net/article/61810.htm 1.安装easy_install,就是为了我们安装第 ...

  3. ARM的一些基本概念

    MPU介绍: mpu是一个芯片,重力加速器(加速度)和陀螺仪(角速度) iic总线.在板上有iic控制器 连接着 最多128个外设,每个外设有地址,可以通信. 寄存器: cpu中的寄存器是为了加快运算 ...

  4. IOS第七天(2:UiTableView 加上数据分离)

    ****加上数据分离 #import "HMViewController.h" #import "HMStudent.h" @interface HMViewC ...

  5. js循环的总结

    js原生的循环有两种,一般的for循环和for...in循环.还有一种常用jQuery.each()循环. 一. js原生循环 a. for循环,代码如下: var myArray = [1,2,3] ...

  6. C#写的CRC16检验算法

    /// <summary> /// CRC校验 /// </summary> public class CRC { #region CRC16 public static by ...

  7. 利用vs2013简单初探Python

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

  8. 多个java文件编译并打成jar包经典方法

    首先,多个java文件的编译 find . -type f -name *.java > compilelist (.代表当前路径) javac -cp "$CLASSPATH&quo ...

  9. JQuery执行DOM批量克隆并插入的提效方法

    JQuery clone方法可以实现对指定DOM对象的快速复制,并插入文档中. 对于同一类型的对象往往需要按照同一样式模板(HTML标签代码)复制N份并插入文档中,然后再将内容填入模板中,这就需要批量 ...

  10. NULL对反连接的影响

    测试准备: create table t1(col1 number,col2 varchar2(1)); create table t2(col2 varchar2(1),col3 varchar2( ...