转载请注明:http://blog.csdn.net/j903829182/article/details/38405735

反射主要是指程序能够訪问。检測和改动它本身的状态或行为的一种能力。

java中反射是一种强大的工具。它可以创建灵活的代码,这些代码可以在执行时装载,无须在组件之间进行链接。反射同意在编写与执行时,使程序可以接入到jvm中的类的内部信息,而不是源码中选定的类协作的代码。这使反射成为构建灵活应用代码的主要工具。

须要注意的是,假设使用不当。反射的成本会非常高。

package com.wj.reflect;

import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier; public class TestReflect1 { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//反射1使用。全部的类的对象都是Class的实例
ReflectDemo demo=new ReflectDemo();//创建一个对象
System.out.println("name="+demo.getClass().getName());//得到对象所属类的路径 //定义3个Class的实例
Class<?> demo1=null;
Class<?> demo2=null;
Class<?> demo3=null; //通过三种方式对class对象进行初始化
try {
demo1=Class.forName("com.wj.reflect.ReflectDemo");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} demo2=new ReflectDemo().getClass();
demo3=ReflectDemo.class; System.out.println("the class name is "+demo1.getName());
System.out.println("the class name is "+demo2.getName());
System.out.println("the class name is "+demo3.getName()); //通过Class的实例对其它的对象进行实例化
Class<?> demo4=null;
try {
demo4=Class.forName("com.wj.reflect.ReflectPerson");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ReflectPerson rp=null;
try {
rp=(ReflectPerson) demo4.newInstance();//利用反射机制实例化ReflectPerson的对象
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
rp.setName("张三");
rp.setSex("男");
System.out.println(rp); //通过Class调用其它类中的构造函数
Class<?> demo5=null;
try {
demo5=Class.forName("com.wj.reflect.ReflectPerson");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//定义三个对象
ReflectPerson rp1=null;
ReflectPerson rp2=null;
ReflectPerson rp3=null;
//取得ReflectPerson的全部构造函数
Constructor<?> cs[]=null;
try {
cs=demo5.getConstructors();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("the first constructs is "+cs[0]);
System.out.println("the second constructs is "+cs[1]);
System.out.println("the third constructs is "+cs[2]);
//利用构造函数进行初始化
try {
rp1=(ReflectPerson) cs[1].newInstance("李四","女");
rp2=(ReflectPerson) cs[0].newInstance("邓紫棋");
rp3=(ReflectPerson) cs[2].newInstance();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} //进行输出
System.out.println("the rp1 is "+rp1);
System.out.println("the rp2 is "+rp2);
System.out.println("the rp3 is "+rp3);
System.out.println("-------------------------");
//返回一个类实现的接口
Class<?> demo6=null;
try {
demo6=Class.forName("com.wj.reflect.ReflectPerson");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//保存全部接口
Class<?>[] inter=demo6.getInterfaces();
for(int i=0;i<inter.length;i++){
System.out.println("实现了的接口是"+inter[i].getName());
}
//取得的父类
Class<?> sup=demo6.getSuperclass();
System.out.println("the super class is "+sup.getName()); System.out.println("-------------------------");
//取得构造函数的修饰符
Class<? > demo7=null;
try {
demo7=Class.forName("com.wj.reflect.ReflectPerson");
} catch (ClassNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
Constructor<?> con[]=null;
try {
con=demo7.getConstructors();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//打印构造函数
for(int i=0;i<con.length;i++){
Class<?>[] para=con[i].getParameterTypes();
System.out.print("构造方法: ");
/*java.lang.Class.getModifiers()这个类或接口的Java语言修饰符返回整数编码。修饰符包含public,
* protected, private,final, static, abstract 和interface及Java虚拟机的常数。
他们应该使用Modifier类的方法进行解码。 */
int modifi=con[i].getModifiers();
System.out.print(Modifier.toString(modifi)+" ");
System.out.print(con[i].getName());
System.out.print("(");
for(int j=0;j<para.length;j++){
System.out.print(para[j].getName()+"arg"+j);
if(j<para.length-1){
System.out.print(",");
}
}
System.out.println("){}");
}
System.out.println("----------------------------------");
//获取类里面的全部方法
Class<?> demo8=null;
try {
demo8=Class.forName("com.wj.reflect.ReflectPerson");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//获得全部的方法用数组存储
Method[] method=demo8.getMethods();
for(int i=0;i<method.length;i++){
//获得返回值得类型
Class<?> returnType=method[i].getReturnType();
//获得參数
Class<?> para[]=method[i].getParameterTypes();
//获得方法的修饰符
int tempmodifi=method[i].getModifiers();
System.out.print(Modifier.toString(tempmodifi)+" ");
System.out.print(returnType.getName()+" ");
System.out.print(method[i].getName()+" ");
System.out.print("(");
for(int j=0;j<para.length;j++){
System.out.print(para[j].getName()+" "+"arg"+j);
if(j<para.length-1){
System.out.print(",");
}
}
//得到须要抛出的异常
Class<? > excep[]=method[i].getExceptionTypes();
if(excep.length>0){
System.out.print(") throws ");
for(int k=0;k<excep.length;k++){
System.out.print(excep[k].getName()+" ");
if(k<excep.length-1){
System.out.print(",");
}
}
}else{
System.out.print(")");
}
System.out.println("{}");
} System.out.println("取得类的全部属性----------------------------------");
//
Class<? > demo9=null;
try {
demo9=Class.forName("com.wj.reflect.ReflectPerson");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("----------本类属性----------------");
//取得本类的全部属性
Field[] field=demo9.getDeclaredFields();
for(int i=0;i<field.length;i++){
//权限修饰符
int modifi=field[i].getModifiers();
//转换成权限类型
String fier=Modifier.toString(modifi);
//属性类型
Class<?> type=field[i].getType();
//打印属性的定义
System.out.println(fier+" "+type.getName()+
" "+field[i].getName()+";");
}
System.out.println("--------实现的接口或父类的属性---------------");
//取得实现的接口或父类的属性
Field[] field2=demo9.getFields();
for(int j=0;j<field2.length;j++ ){
//权限修饰符
int modifi=field2[j].getModifiers();
//转换成权限类型
String fier=Modifier.toString(modifi);
//属性类型
Class<? > type=field2[j].getType();
System.out.println(fier+" "+type.getName()+
" "+field2[j].getName()+";");
} System.out.println("--------通过反射调用其它类中的方法---------------");
Class<?> demo10=null;
try {
demo10=Class.forName("com.wj.reflect.ReflectPerson");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} try {
//调用ReflectPerson的sayChinese()
Method md=demo10.getMethod("sayChinese");
try {
md.invoke(demo10.newInstance());
//调用ReflectPerson的syaHello
md=demo10.getMethod("sayHello",String.class,int.class);
md.invoke(demo10.newInstance(),"zhangsan",23);
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} System.out.println("\n------------调用其它类的set和get方法--------------");
Object object=null;
try {
object=demo10.newInstance();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
set(object, "Sex", "男", String.class);
get(object,"Sex"); System.out.println("\n------------通过反射操作属性--------------");
//通过反射操作属性
Field f=null;
try {
f=object.getClass().getDeclaredField("sex");
f.setAccessible(true);
f.set(object, "女");
System.out.println("the sex is "+f.get(object));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} System.out.println("\n------------通过取得数组并改动数组的信息--------------");
int [] array={1,2,3,4,5,6,7,8,9};
Class<? > ar=array.getClass().getComponentType();
System.out.println("数组类型:"+ar.getName());
System.out.println("数组长度:"+Array.getLength(array));
System.out.println("数组第一元素:"+Array.get(array, 0));
//改动数组第一元素的信息
Array.set(array, 0, 100);
System.out.println("改动之后数组第一元素:"+Array.get(array, 0)); System.out.println("\n------------通过反射改动数组大小--------------");
int []newArray=(int[]) arrayUpdateLength(array, 15);
print(newArray);
System.out.println("\n*********************************");
String []str1={"a","b","c","d","e"};
String []str2=(String[]) arrayUpdateLength(str1, 10);
print(str2);
System.out.println("\n------------怎样获得类载入器--------------");
Load load=new Load();
System.out.println("类载入器为:"+load.getClass().getClassLoader().getClass().getName());
/*
* 事实上在java中有三种类类载入器:
* 1)Bootstrap ClassLoader 此载入器採用c++编写,一般开发中非常少见。
* 2)Extension ClassLoader 用来进行扩展类的载入,一般相应的是jre\lib\ext文件夹中的类
* 3)AppClassLoader 载入classpath指定的类,是最经常使用的载入器。同一时候也是java中默认的载入器*/ }
//改动数组大小
public static Object arrayUpdateLength(Object object,int len){
Class<?> array=object.getClass().getComponentType();
Object newArray=Array.newInstance(array, len);
int length=Array.getLength(object);
System.arraycopy(object, 0, newArray, 0, length);
return newArray;
} //打印数组
public static void print(Object obj){
Class<?> c=obj.getClass();
if(!c.isArray()){
return;
}
System.out.println("数组长度为:"+Array.getLength(obj));
for(int i=0;i<Array.getLength(obj);i++){
System.out.print(Array.get(obj, i)+" ");
}
} public static void set(Object obj,String attr,
Object value,Class<?> type){
try {
Method method=obj.getClass().getMethod("set"+attr, type);
method.invoke(obj, value);
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} public static void get(Object ob,String attr){
try {
Method method=ob.getClass().getMethod("get"+attr);
System.out.println(method.invoke(ob));
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} } class Load{ } interface Chinese{
public static int age=22;
public void sayChinese();
public void sayHello(String name,int age);
} class ReflectPerson implements Chinese{
private String name;//姓名
private String sex;//性别 public ReflectPerson() {
super();
// TODO Auto-generated constructor stub
} public ReflectPerson(String name) {
super();
this.name = name;
} public ReflectPerson(String name, String sex) {
super();
this.name = name;
this.sex = sex;
}
public void setName(String name){
this.name=name;
}
public String getName(){
return this.name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "ReflectPerson [name=" + name + ", sex=" + sex + "]";
} @Override
public void sayChinese() {
// TODO Auto-generated method stub
System.out.println("hello, I am is Chinese");
} @Override
public void sayHello(String name, int age) {
// TODO Auto-generated method stub
System.out.println("hello ,my name is "+name+" and my age is "+age);
} } class ReflectDemo{ }

程序执行结果:

name=com.wj.reflect.ReflectDemo

the class name is com.wj.reflect.ReflectDemo

the class name is com.wj.reflect.ReflectDemo

the class name is com.wj.reflect.ReflectDemo

ReflectPerson [name=张三, sex=男]

the first constructs is public com.wj.reflect.ReflectPerson(java.lang.String)

the second constructs is public com.wj.reflect.ReflectPerson(java.lang.String,java.lang.String)

the third constructs is public com.wj.reflect.ReflectPerson()

the rp1 is ReflectPerson [name=李四, sex=女]

the rp2 is ReflectPerson [name=邓紫棋, sex=null]

the rp3 is ReflectPerson [name=null, sex=null]

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

实现了的接口是com.wj.reflect.Chinese

the super class is java.lang.Object

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

构造方法:   public  com.wj.reflect.ReflectPerson(java.lang.Stringarg0){}

构造方法:   public  com.wj.reflect.ReflectPerson(java.lang.Stringarg0,java.lang.Stringarg1){}

构造方法:   public  com.wj.reflect.ReflectPerson(){}

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

public  java.lang.String  toString (){}

public  java.lang.String  getName (){}

public  void  setName (java.lang.String arg0){}

public  void  setSex (java.lang.String arg0){}

public  void  sayChinese (){}

public  void  sayHello (java.lang.String arg0,int arg1){}

public  java.lang.String  getSex (){}

public final native  void  wait (long arg0) throws java.lang.InterruptedException  {}

public final  void  wait () throws java.lang.InterruptedException  {}

public final  void  wait (long arg0,int arg1) throws java.lang.InterruptedException  {}

public  boolean  equals (java.lang.Object arg0){}

public native  int  hashCode (){}

public final native  java.lang.Class  getClass (){}

public final native  void  notify (){}

public final native  void  notifyAll (){}

取得类的所有属性----------------------------------

----------本类属性----------------

private java.lang.String name;

private java.lang.String sex;

--------实现的接口或父类的属性---------------

public static final int age;

--------通过反射调用其它类中的方法---------------

hello, I am is Chinese

hello ,my name is zhangsan and my age is 23





------------调用其它类的set和get方法--------------







------------通过反射操作属性--------------

the sex is 女





------------通过取得数组并改动数组的信息--------------

数组类型:int

数组长度:9

数组第一元素:1

改动之后数组第一元素:100





------------通过反射改动数组大小--------------

数组长度为:15

100 2 3 4 5 6 7 8 9 0 0 0 0 0 0 

*********************************

数组长度为:10

a b c d e null null null null null 

------------怎样获得类载入器--------------

类载入器为:sun.misc.Launcher$AppClassLoader

參考文章为:http://www.cnblogs.com/rollenholt/archive/2011/09/02/2163758.html

java中反射学习整理的更多相关文章

  1. Java中反射的三种常用方式

    Java中反射的三种常用方式 package com.xiaohao.test; public class Test{ public static void main(String[] args) t ...

  2. Java中反射的实现方式

    所谓反射,是指在运行时状态中,获取类中的属性和方法,以及调用其中的方法的一种机制.这种机制的作用在于获取运行时才知道的类(Class)及其中的属性(Field).方法(Method)以及调用其中的方法 ...

  3. 简单模拟Java中反射的应用场景

    有人说Java是一门静态语言.那么何为静态语言,动态语言又是什么? 1.动态语言 是一类在运行时可以改变其结构的语言:例如新的函数.对象.甚至代码可以 被引进,已有的函数可以被删除或是其他结构上的变化 ...

  4. Java设计模式(学习整理)---命令模式

    设计模式之Command(学习整理) 1.Command定义 不少Command模式的代码都是针对图形界面的,它实际就是菜单命令,我们在一个下拉菜单选择一个命令时,然后会执行一些动作. 将这些命令封装 ...

  5. JAVA中反射机制五(java.lang.reflect包)

    一.简介 java.lang.reflect包提供了用于获取类和对象的反射信息的类和接口.反射API允许对程序访问有关加载类的字段,方法和构造函数的信息进行编程访问.它允许在安全限制内使用反射的字段, ...

  6. Java中反射机制详解

    序言 在学习java基础时,由于学的不扎实,讲的实用性不强,就觉得没用,很多重要的知识就那样一笔带过了,像这个马上要讲的反射机制一样,当时学的时候就忽略了,到后来学习的知识中,很多东西动不动就用反射, ...

  7. JAVA中反射机制六(java.lang.reflect包)

    一.简介 java.lang.reflect包提供了用于获取类和对象的反射信息的类和接口.反射API允许对程序访问有关加载类的字段,方法和构造函数的信息进行编程访问.它允许在安全限制内使用反射的字段, ...

  8. Java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别

    一.Java的反射机制   每个Java程序执行前都必须经过编译.加载.连接.和初始化这几个阶段,后三个阶段如下图:   其中

  9. Java中反射与常用方法

    java通常是先有类再有对象,有对象我就可以调用方法或者属性. 反射其实是通过Class对象来调用类里面的方法.通过反射可以调用私有方法和私有属性.大部分框架都是运用反射原理.   如何获得Class ...

随机推荐

  1. ios 以NSObject为父类的各类间继承关系

  2. 用CSS/CSS3 实现 水平居中和垂直居中的完整攻略

    水平居中:行内元素解决方案 只需要把行内元素包裹在一个属性display为block的父层元素中,并且把父层元素添加如下属性即可:   .parent { text-align:center; } 水 ...

  3. 用Visual Studio2010 编译 C++文件"hello world”

    本周开始学习C++语言,用Visual Studio 2010做编译器,发现站内还没有基础的关于用VS2010编译程序的教材.而且自己在网上寻找时候,教程难找,而且大都不详细.故写一个关于这方面的教程 ...

  4. hdu1016Prime Ring Problem

     就是说,给你一个数n, 要你把1到n都连在一起成环. 每一个数不可反复, 且相连的两个数的和要是素数. 把全部情况输出来. 我是用dfs暴力出来的. 首先把素数打表, 然后每次顺时针预測下一个数 ...

  5. servlet基本概念

    一.servlet是一个供其它java程序调用的java类,比方tomcatserver,它不能独自执行,它的执行由servlet引擎来控制和调度. 二.servlet是单例,多线程 针对多个clie ...

  6. visual studio 2015离线版msdn下载和安装

    2014年11月13日,微软发布了Visual Studio 2015 Preview,但是Visual Studio 2015 的msdn该如何安装呢?下面脚本之家就为大家分享一篇visual st ...

  7. js数组去重,并统计最多项算法

    从事了一段时间的前端开发,今天写了一个数组去重,并统计最多项的方法,目前只支持数组的项都是数字. 由于本人能力有限,希望能得到网友的指正!如有问题或者更好的实现思路,也欢迎大家和我讨论!代码如下: f ...

  8. FLASH图片上传功能—从百度编辑器UEditor里面提取出来

    为了记录工作中碰到的各种问题,以及学习资料整理,今天开始,将以往的文章进行了一个整理,以后也开始认真的记录学习过程中的各种问题 在HTML里面的文件上传功能一直是个问题,为了实现上传文件大小限制,怎样 ...

  9. Nohttp请求图片的两种简答的方式:普通请求以及缓存请求

    开局声明:这是基于nohttp1.0.4-include-source.jar版本写的教程 由于nohttp功能强悍,因此需要多种权限,仅仅一个联网的权限是不够的,如果只给了Internet的权限,去 ...

  10. Android Training: 设备管理

    Android 设备管理 Android2.2 通过Android设备管理API提供对企业级应用的支持.设备管理API在系统级别提供了设备管理特性.这些API可以在企业环境下,需要对员工设备进行控制时 ...