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

Java反射

2016-05-18 14:25 423 查看
(1)Java中出去静态的,万事万物皆对象

(2)反射的存在可以绕过编译,在程序运行时决定加载的类,区别去编译时加载程序中涉及到全部类的方式。

(3)通过反射可以实现的效果

(1动态实现类的加载

(2获取当前正在执行类的方法信息

(3获取当前正在执行类的成员变量和构造函数信息

(4获取当前正在执行类的方法反射,从而实现方法调用

(4)实例:集合泛型在编译时add等方法对参数的审查,通过反射可以绕过检查机制,将int类型的值加入到String类型的集合中

package com.czh.studyday9.reflect;

import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
* 反射机制
* @author J_X
*
*/

public class ReflectTest {

public static void main(String[] args) {
// TODO Auto-generated method stub
Integer integer = 3;
//获取类的类型
//方式一
Class<?> type1 = integer.getClass();
//方式二
Class<?> type2 = Integer.class;
Class<?> type3 = null;
//方式三java.lang.Integer
try {
type3 = Class.forName("com.czh.studyday5.person.WX");

Method [] temp = type3.getMethods();

for (int i=0; i<temp.length; ++i)
{
Annotation [] tempA= temp[i].getAnnotations();
for (Annotation annotation : tempA) {
System.err.println("Annotation->"+annotation.toString());
}
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

//获取类的方法信息type1.getMethods()
Method[] methods = type1.getDeclaredMethods();
for (int i=0; i<methods.length; ++i) {
Method m = methods[i];
System.out.print(m.getReturnType()+ " ");
System.out.print(m.getName() + "(");
Class<?>[] params = m.getParameterTypes();
for (int j=0; j<params.length; ++j) {
Class<?> p = params[j];
System.out.print(p.getName());
if (j != (params.length -1))
{
System.out.print(", ");
}
}
System.out.println(")");
}
try {
Method m = type3.getDeclaredMethod("testReflect", int.class);
m.setAccessible(true);
System.err.println("getMoney = "+ m.invoke(type3.newInstance(), 10).toString());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//获取类声明变量的方法
Field[] fields= type2.getDeclaredFields();
for (int k = 0; k<fields.length; ++k)
{
System.err.println(fields[k].toGenericString());
}
//获取构造函数
Constructor<?> [] constructors = type2.getConstructors();
for (int i=0; i<constructors.length; ++i)
{
Constructor<?> c = constructors[i];
System.out.print(c.getName()+ "(");
Class<?>[] p =  c.getParameterTypes();
for (Class<?> p1 : p) {
System.out.print(p1.getName() + ",");
}
System.out.println(")");
}
}

}
运行结果:

int numberOfLeadingZeros(int)
int numberOfTrailingZeros(int)
int bitCount(int)
boolean equals(java.lang.Object)
class java.lang.String toString(int, int)
class java.lang.String toString()
class java.lang.String toString(int)
int hashCode(int)
int hashCode()
int min(int, int)
int max(int, int)
int reverseBytes(int)
int compareTo(java.lang.Integer)
int compareTo(java.lang.Object)
byte byteValue()
short shortValue()
int intValue()
long longValue()
float floatValue()
double doubleValue()
class java.lang.Integer valueOf(java.lang.String, int)
class java.lang.Integer valueOf(int)
class java.lang.Integer valueOf(java.lang.String)
class java.lang.String toHexString(int)
int compare(int, int)
class java.lang.Integer decode(java.lang.String)
void getChars(int, int, [C)
int reverse(int)
int stringSize(int)
int sum(int, int)
int parseInt(java.lang.String)
int parseInt(java.lang.String, int)
long toUnsignedLong(int)
int compareUnsigned(int, int)
int divideUnsigned(int, int)
int formatUnsignedInt(int, int, [C, int, int)
class java.lang.Integer getInteger(java.lang.String, java.lang.Integer)
class java.lang.Integer getInteger(java.lang.String, int)
class java.lang.Integer getInteger(java.lang.String)
int highestOneBit(int)
int lowestOneBit(int)
int parseUnsignedInt(java.lang.String)
int parseUnsignedInt(java.lang.String, int)
int remainderUnsigned(int, int)
int rotateLeft(int, int)
int rotateRight(int, int)
int signum(int)
class java.lang.String toBinaryString(int)
class java.lang.String toOctalString(int)
class java.lang.String toUnsignedString(int)
class java.lang.String toUnsignedString(int, int)
class java.lang.String toUnsignedString0(int, int)
getMoney = -10
public static final int java.lang.Integer.MIN_VALUE
public static final int java.lang.Integer.MAX_VALUE
public static final java.lang.Class<java.lang.Integer> java.lang.Integer.TYPE
static final char[] java.lang.Integer.digits
static final char[] java.lang.Integer.DigitTens
static final char[] java.lang.Integer.DigitOnes
static final int[] java.lang.Integer.sizeTable
private final int java.lang.Integer.value
public static final int java.lang.Integer.SIZE
public static final int java.lang.Integer.BYTES
private static final long java.lang.Integer.serialVersionUID
java.lang.Integer(int,)
java.lang.Integer(java.lang.String,)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: