黑马程序员-反射的常用方法

原创 2012年03月24日 11:01:11

---------------------- android培训java培训、期待与您交流! -----------------------


在JDK中,主要由以下类来实现Java反射机制,这些类都位于java.lang.reflect包中:
1.Class类:代表一个类。
2.Field类:代表类的成员变量(成员变量也称为类的属性)。代表字段
3.Method类:代表类的方法。
4.Constructor类:代表类的构造方法。
5.Array类:提供了动态创建数组,以及访问数组元素的静态方法。
◆.Class类
在java.lang.Object类中定义了getClass()方法,因此对于任意一个Java对象,都可以通过此方法获得对象的类型。
Class类是Reflection API中的核心类,它有以下方法
(1)获得对象的类型:
getName():获得类的完整名字。
getFields():获得类的public类型的属性。
getDeclaredFields():获得类的所有属性。
getMethods():获得类的public类型的方法。
getDeclaredMethods():获得类的所有方法。
getMethod(String name, Class[] parameterTypes):获得类的特定方法,name参数指定方法的名字,parameterTypes参数指定方法的参数类型。
getConstrutors():获得类的public类型的构造方法。
getConstrutor(Class[] parameterTypes):获得类的特定构造方法,parameterTypes参数指定构造方法的参数类型。
newInstance():通过类的不带参数的构造方法创建这个类的一个对象。
(2)通过默认构造方法创建一个新的对象:
Object objectCopy=classType.getConstructor(new Class[]{}).newInstance(new Object[]{});
(3)获得对象的所有属性:
Field fields[]=classType.getDeclaredFields();
 Class类的getDeclaredFields()方法返回类的所有属性,包括public、protected、默认和private访问级别的属性。
以上代码先调用Class类的getConstructor()方法获得一个Constructor对象,它代表默认的构造方法,然后调用Constructor对象的newInstance()方法构造一个实例。
(4)获得每个属性相应的getXXX()和setXXX()方法,然后执行这些方法,把原来对象的属性复制到新的对象中:
 for(int i=0; i  Field field=fields[i];  
String fieldName=field.getName(); 
 String firstLetter=fieldName.substring(0,1).toUpperCase(); 
 //获得和属性对应的getXXX()方法的名字  String getMethodName="get"+firstLetter+fieldName.substring(1);  
//获得和属性对应的setXXX()方法的名字  String setMethodName="set"+firstLetter+fieldName.substring(1);  
//获得和属性对应的getXXX()方法 
 Method getMethod=classType.getMethod(getMethodName,new Class[]{}); 
 //获得和属性对应的setXXX()方法 
 Method setMethod=classType.getMethod(setMethodName,new Class[]{field.getType()});  
//调用原对象的getXXX()方法  
Object value=getMethod.invoke(object,new Object[]{}); 
 System.out.println(fieldName+":"+value);  
//调用复制对象的setXXX()方法 
 setMethod.invoke(objectCopy,new Object[]{value});}
◆.Method类的invoke(Object obj,Object args[])方法接收的参数必须为对象,如果参数为基本类型数据,必须转换为相应的包装类型的对象。
invoke()方法的返回值总是对象,如果实际被调用的方法的返回类型是基本类型数据,那么invoke()方法会把它转换为相应的包装类型的对象,再将其返回。
 ◆.Array类
java.lang.Array类提供了动态创建和访问数组元素的各种静态方法。如例程10-4所示的ArrayTester1类的main()方法创建了一个长度为10的字符串数组,接着把索引位置为5的元素设为“hello”,然后再读取索引位置为5的元素的值。
import java.lang.reflect.*;
public class ArrayTester1 {
  public static void main(String args[])throws Exception {   
 Class classType = Class.forName("java.lang.String");   
//创建一个长度为10的字符串数组  
  Object array = Array.newInstance(classType, 10);   
 //把索引位置为5的元素设为"hello"  
  Array.set(array, 5, "hello");   
//读取索引位置为5的元素的值   
String s = (String) Array.get(array, 5);    System.out.println(s);  }}


------------------- android培训java培训、期待与您交流! ----------------------

整理Java反射常用方法

整理常用的Java反射相关的方法,方便查询记忆。
  • github_35180164
  • github_35180164
  • 2016年07月26日 16:30
  • 635

黑马程序员骗局

最近看到网上的一篇帖子:“传智播客旗下黑马程序员就业骗局,企业封杀遇到了骗子培训” 。    黑马程序员面对诋毁,诽谤,真的想置之不理,让谣言自生自灭。看看那篇帖子的发布时间大概在2013年或者2...
  • itcast_cn
  • itcast_cn
  • 2016年09月05日 15:22
  • 3354

黑马程序员 —— 复习反射的内容

1.取得Class类对象的三种方式 public class Test{ public static void main(String[] args) { try{ Class clazz...
  • Lin1i1y
  • Lin1i1y
  • 2015年02月06日 14:46
  • 357

黑马程序员---反射的学习

---------------------- android培训、java培训、期待与您交流! ---------------------- 反射,是Java中非常重要的一个功能,如果没...
  • za143567229za
  • za143567229za
  • 2012年07月25日 11:35
  • 219

黑马程序员___java反射的总结

---------------------- android培训、java培训、期待与您交流! ---------------------- 一、       反射的基础_Class类 1...
  • ICAN1112233
  • ICAN1112233
  • 2012年06月07日 09:37
  • 215

黑马程序员——反射的实际应用

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 一。应用配置文件运行类中的方法 定义一个类 public class Worker { ...
  • DoSamba
  • DoSamba
  • 2015年12月28日 02:32
  • 289

黑马程序员--Spring框架方方面面之…

--------
  • li951418089
  • li951418089
  • 2015年12月24日 10:25
  • 614

黑马程序员-反射的应用

一、构造方法的应用
  • dong53821713
  • dong53821713
  • 2014年08月31日 09:55
  • 238

黑马程序员_反射的应用

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 一、反射技术在开发框架原理上的应用: 其实我刚学完反射一直有个疑惑,反射到底有什么用?已...
  • u011449569
  • u011449569
  • 2015年11月02日 03:08
  • 211

黑马程序员:反射的总结

/*反射技术:该程序只要之前写好如何读取配置文件信息即可。 把具体实现的子类的名称定义到配置文件中。如果存储了指定的子类名,就根据 具体的名称找到该类并进行加载和对象的创建,这些动作都在前期定义软件时...
  • javafresh0413
  • javafresh0413
  • 2014年08月03日 14:39
  • 177
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:黑马程序员-反射的常用方法
举报原因:
原因补充:

(最多只允许输入30个字)