您的位置:首页 > 编程语言 > Java开发

三个例子讲清楚Java反射

2015-12-10 23:23 417 查看
通过三个例子分析java中反射的常见用法 from caicongyang

ReflectiveTest.java (反射类的基础API)

package com.ccy.reflective;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

import org.junit.Test;

/**
* <p>
* Title: ReflectiveTest.java
* Package com.ccy.reflective
* </p>
* <p>
* Description: 反射API测试类
* <p>
* @author Tom.Cai
* @created 2015-12-10 下午10:30:12
* @version V1.0
*
*/
public class ReflectiveTest {
/**
* 反射获取类信息
*/
@Test
public void reflectiveGetClassInfo(){
try {
Class cls = Class.forName("java.lang.String");
//获取父类
Class superclass = cls.getSuperclass();
System.out.println(superclass.getName());
//获取类的修饰符
int modify = cls.getModifiers();
String retval = Modifier.toString(modify);
System.out.println(retval);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}

}

/**
* 反射获取类的构造函数
*/
@Test
public void reflectiveGetConstructors(){
try {
Class cls = Class.forName("java.lang.String");
//获取构造方法
Constructor<String>[] declaredConstructors = cls.getDeclaredConstructors();
for(Constructor<String> con:declaredConstructors){
//获取构造方法的名称
String name = con.getName();
System.out.println(name);
//获取构造方法的修饰符
int conModify = con.getModifiers();
String conRetval = Modifier.toString(conModify);
System.out.println(conRetval);
//循环获取构造函数的参数
Class<?>[] parameterTypes = con.getParameterTypes();
for(int i = 0;i<parameterTypes.length;i++){
System.out.println(parameterTypes[i].getName());
}
System.out.println("------");
}

} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}

/**
* 反射获取类的字段
*/
@Test
public void reflectiveGetClassFields(){
try {
Class cls = Class.forName("java.lang.String");
Field[] fields = cls.getDeclaredFields();
for(Field f:fields){
//获取字段类型名称
Class<?> type = f.getType();
String typeName = type.getName();
System.out.println(typeName);

//获取字段修饰符
int modify = f.getModifiers();
String modifyName = Modifier.toString(modify);
System.out.println(modifyName);

//获取字段名称
String filedName = f.getName();
System.out.println(filedName);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}

/**
* 反射获取类方法信息
*/
@Test
public void reflectiveGetClassMethods(){
try {
Class cls = Class.forName("java.lang.String");
Method[] declaredMethods = cls.getDeclaredMethods();
for(Method m:declaredMethods){
//获取还回类型名称
Class<?> returnType = m.getReturnType();
String returnTypeName = returnType.getName();
System.out.println(returnTypeName);

//获取方法修饰符
int modifiers = m.getModifiers();
String modifiersName = Modifier.toString(modifiers);
System.out.println(modifiersName);

//循环获取参数类型名称
Class<?>[] parameterTypes = m.getParameterTypes();
for(int i=0;i<parameterTypes.length;i++){
String parameterName = parameterTypes[i].getName();
System.out.println(parameterName);
}
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}


ReflectiveTest2.java(运行时反射获取字private段属性值)

package com.ccy.reflective;

import java.lang.reflect.Field;

import org.junit.Test;

/**
*
* <p>
* Title: ReflectiveTest2.java
* Package com.ccy.reflective
* </p>
* <p>
* Description: 运行时反射获取类字段值
* <p>
* @author Tom.Cai
* @created 2015-12-10 下午10:56:40
* @version V1.0
*
*/
public class ReflectiveTest2 {

@Test
public void runTimeReflective(){
Person person  = new Person();
person.setAge(25);
person.setName("Tom");

try {
Class<? extends Person> cls = person.getClass();
Field[] fields = cls.getDeclaredFields();

for(Field field :fields){
field.setAccessible(true);
System.out.println(field.getName());
System.out.println(field.get(person));
}
} catch (Exception e) {
e.printStackTrace();
}

}

class Person{
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}

}


ReflectiveTest3.java(通过反射实现已填充数组的长度自增长通过方法)

package com.ccy.reflective;

import java.lang.reflect.Array;

/**
* <p>
* Title: ReflectiveTest3.java
* Package com.ccy.reflective
* </p>
* <p>
* Description: 通过反射实现已填充对象数组的自增长
* <p>
* @author Tom.Cai
* @created 2015-12-10 下午11:12:38
* @version V1.0
*
*/
public class ReflectiveTest3 {
public static void main(String[] args) {
int[] a ={1,2,3};
a = (int[]) goodArrayGrow(a);
System.out.println(a.length);
}

/**
* 通过反射实现已填充对象的数组自增长 10%+10
* @param object
* @return
*/
public static Object goodArrayGrow(Object object){
Class cls = object.getClass();
if(!cls.isArray()){
return null;
}
Class componentType = cls.getComponentType();
int length = Array.getLength(object);
int newLen = length * 11/10+10;
Object newArray = Array.newInstance(componentType, newLen);
System.arraycopy(object, 0, newArray, 0, length);
return newArray;
}
}


写在最后:高级程序员都通过代码理解API

记录与分享,你我共成长!我的其他精彩博客:http://blog.csdn.net/caicongyang
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: