1.概念

  反射主要是指程序可以访问,检测和修改它本身的状态或行为的一种能力

  Java中的反射是一种强大的工具,它能够创建灵活的代码,这些代码可以运行时装配,无须在组件之间进行链接

  反射允许在编写与执行时,使程序代码能够接入装载到JVM中的类的内部信息,而不是源代码中选定的类协作的代码

  如果使用不当,反射的成本会很高

2.例子

 package Test;

 import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier; interface TestInterface{
public static String username = "zhengbin";
public static String password = "19950906";
public String add(); } class Demo implements TestInterface{
private String username;
private String password; public Demo() {
super();
} // public Demo(String username, String password) {
// super();
// this.username = username;
// this.password = password;
// } public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String toString() {
return "Demo [username=" + username + ", password=" + password + "]";
}
public String add(){
return "add()";
}
} public class Test1 { public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
Demo d = null;
/* Class 在API中的解释:
*
* Class 类的实例表示正在运行的 Java 应用程序中的类和接口
* 每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象
* 基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也表示为 Class 对象
* Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的
*
*/
Class<?> c = Class.forName("Test.Demo");
System.out.println(c.getName()); d = (Demo)c.newInstance();
d.setUsername("zhengbin");
d.setPassword("19950906");
System.out.println(d); // 获得反射类的父类
System.out.println(d.getClass().getSuperclass().getName()); // 获得类中的全部构造函数
Constructor<?> cons[] = c.getConstructors();
for(int i = 0;i < cons.length;i++){
System.out.println(cons[i]);
} System.out.println("---------本类的所有属性----------");
// 获得本类的所有属性
Field[] field = c.getDeclaredFields();
for (int i = 0; i < field.length; i++) {
// 权限修饰符
int mo = field[i].getModifiers();
// 获得属性名
String priv = Modifier.toString(mo);
// 属性类型
Class<?> type = field[i].getType();
System.out.println(priv + " " + type.getName() + " "
+ field[i].getName() + ";");
} System.out.println("---------实现的接口或者父类的属性----------");
// 取得实现的接口或者父类的属性
Field[] filed1 = c.getFields();
for (int j = 0; j < filed1.length; j++) {
// 权限修饰符
int mo = filed1[j].getModifiers();
String priv = Modifier.toString(mo);
// 属性类型
Class<?> type = filed1[j].getType();
System.out.println(priv + " " + type.getName() + " "
+ filed1[j].getName() + ";");
}
} }

运行结果:

Test.Demo
Demo [username=zhengbin, password=yqxx950906]
java.lang.Object
public Test.Demo()
---------本类的所有属性----------
private java.lang.String username;
private java.lang.String password;
---------实现的接口或者父类的属性----------
public static final java.lang.String username;
public static final java.lang.String password;

例二:

  现在要求:

  (1) 你不能使用 HelloWorld hw = new HelloWorld(),但是要构建一个HelloWorld的实例来

  (2) 调用 sayHello() 方法,但是不能直接用 HelloWorld实例的 hw.sayHello() 方法

 package Test;

 import java.lang.reflect.Method;

 public class Test2 {

     @org.junit.Test
public void test1(){
try {
Class c = Class.forName("Test.Say");
Object o = c.newInstance(); Method m = c.getDeclaredMethod("sayHello");
m.invoke(o); Method m1 = c.getDeclaredMethod("sayName", String.class);
m1.invoke(o, "zhengbin");
} catch (Exception e) {
e.printStackTrace();
}
} } class Say{
public void sayHello(){
System.out.println("Hello World");
}
public void sayName(String name){
System.out.println("Hello "+name);
}
}

运行结果:

Hello World
Hello zhengbin

详情:http://www.cnblogs.com/rollenholt/archive/2011/09/02/2163758.html

  http://mp.weixin.qq.com/s?__biz=MzAxOTc0NzExNg==&mid=406392698&idx=1&sn=841f236f636e65a6b501ff79bb562aa1&scene=23&srcid=0409vaYyVB4IzSHV11seyPGA#rd

一天一个Java基础——反射的更多相关文章

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

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

  2. Java基础——反射

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

  3. Java基础反射(二)

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

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

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

  5. Java基础--反射机制的知识点梳理

    什么是反射? 正常编译执行java文件时,会生成一个.class文件,反射就是一个反编译的过程,它可以通过.class文件得到一个java对象.一个类会有很多组成部分,比如成员变量,成员方法,构造方法 ...

  6. 一天一个Java基础——泛型

    这学期的新课——设计模式,由我仰慕已久的老师传授,可惜思维过快,第一节就被老师挑中上去敲代码,自此在心里烙下了阴影,都是Java基础欠下的债 这学期的新课——算法设计与分析,虽老师不爱与同学互动式的讲 ...

  7. [java 基础]反射入门

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

  8. JAVA基础-反射机制

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

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

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

随机推荐

  1. linux源代码阅读笔记 get_free_page()代码分析

    /* 34 * Get physical address of first (actually last :-) free page, and mark it 35 * used. If no fre ...

  2. javascript中li标签的排序和数组sort的用法

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  3. .net中的认证(authentication)与授权(authorization)

    “认证”与“授权”是几乎所有系统中都会涉及的概念,通俗点讲: 1.认证(authentication) 就是 "判断用户有没有登录?",好比windows系统,没登录就无法使用(不 ...

  4. [主席树]ZOJ2112 && BZOJ1901 Dynamic Rankings

    题意:n个数,q个询问 (n<=50000, q<=10000) Q x y z 代表询问[x, y]区间里的第z小的数 C x y    代表将(从左往右数)第x个数变成y 上篇介绍了在 ...

  5. Project Euler 100 : Arranged probability 安排概率

    Arranged probability If a box contains twenty-one coloured discs, composed of fifteen blue discs and ...

  6. AJAX POST请求中参数以form data和request payload形式在servlet中的获取方式

    转载:http://blog.csdn.net/mhmyqn/article/details/25561535 HTTP请求中,如果是get请求,那么表单参数以name=value&name1 ...

  7. 汉诺塔算法的递归与非递归的C以及C++源代码

    汉诺塔(又称河内塔)问题其实是印度的一个古老的传说. 开天辟地的神勃拉玛(和中国的盘古差不多的神吧)在一个庙里留下了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一 个小, ...

  8. Orcle数据库查询练习复习:三

    一.题目 1.与“张三”同乡的男生姓名 select * from student where snativeplace=(select snativeplace from student where ...

  9. Xamarin.Android 入门之:xamarin使用webserver和html交互

    一.引言 如今,Android+html5开发已经成为最流行的开发模式. Android 中可以通过webview来实现和js的交互,在程序中调用js代码,只需要将webview控件的支持js的属性设 ...

  10. erp中三大订单CO、PO、MO各是代表什么?

    ERP即 企业资源计划 (Enterprise Resource Planning),由美国 Gartner Group 公司于1990年提出. ERP系统是指建立在信息技术基础上,以系统化的管理思想 ...