1. Constructor
/**/
/*
介绍:
Constructor 提供关于类的单个构造方法的信息以及对它的访问权限。
输出:
java.util.ArrayList: Collection
java.util.ArrayList: int
java.util.ArrayList:
*/
package
api.java.lang.reflect;
import
java.lang.reflect.Constructor;
public
class
Class_Constructor
{
public
static
void
main(String[] args)
{
try
{
Class c
=
Class.forName(
"
java.util.ArrayList
"
);
Constructor constructors[]
=
c.getConstructors();
for
(
int
i
=
0
; i
<
constructors.length; i
++
)
{
System.out.print(constructors[i].getName()
+
"
:
"
);
Class parameters[];
//
分别得到ArrayList三个构造函数的参数
parameters
=
constructors[i].getParameterTypes();
for
(
int
j
=
0
; j
<
parameters.length; j
++
)
{
//
得到参数名
String s
=
parameters[j].getName();
s
=
s.substring(s.lastIndexOf(
"
.
"
)
+
1
, s.length());
System.out.print(s
+
"
"
);
}
System.out.println(
""
);
}
}
catch
(Exception ex)
{
ex.printStackTrace();
}
}
}
主要经验值获得:
1.java.lang.reflect.Constructor 作用
2.如何获得一个类构造函数的参数
次要经验值获得:
1.s
= s.substring(s.lastIndexOf(".") + 1, s.length()); 得到指定符号后的字符串
----------------------------------------------------------------------------------------------
2. Skill_HiddenFieldModification
/**//*
输出:
Before: [a=21.25, b=54.5, c=5665, d=2043, e=3121, f=1019]
After: [a=21.25, b=54.5, c=0, d=0, e=0, f=0]
*/
package api.java.lang.reflect;
import java.lang.reflect.Field;
public class Skill_HiddenFieldModification {
// 把所有int置为0
public static void initIntFields(final Object obj) {
try {
/**//*
* getDeclaredFields() 返回 Field 对象的一个数组,这些对象反映此 Class
* 对象所表示的类或接口所声明的所有字段,包括公共、保护、默认(包)访问和私有字段,但不包括继承的字段。
*/
Field[] fields = obj.getClass().getDeclaredFields();
for (int idx = 0; idx < fields.length; idx++) {
//如果是int
if (fields[idx].getType() == int.class) {
/**//* setAccessible(boolean)
* 将此对象的 accessible 标志设置为指示的布尔值。值为 true 则指示反射的对象在使用时应该取消
* Java 语言访问检查。值为 false 则指示反射的对象应该实施 Java 语言访问检查。
*/
fields[idx].setAccessible(true);
fields[idx].setInt(obj, 0);
}
}
} catch (final IllegalAccessException ex) {
throw new RuntimeException(ex);
}
}
public static final void main(final String[] args) {
SomeNumbers value = new SomeNumbers();
System.out.println("Before: " + value);
initIntFields(value);
System.out.println("After: " + value);
}
}
class SomeNumbers {
public double a = 21.25d;
public float b = 54.5f;
public int c = 5665;
public int d = 2043;
protected int e = 3121;
private int f = 1019;
public String toString() {
return new String("[a=" + a + ", b=" + b + ", c=" + c + ", d=" + d
+ ", e=" + e + ", f=" + f + "]");
}
} 主要经验值获得:
1.java.lang.reflect.Field 作用
2.基本类型过滤的方法
---------------------------------------------------------------------------------------------
3. Class_MethodgetModifiers
/**//*
输出:
Public Methods:
a1
a2
*/
package api.java.lang.reflect;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
public class Class_MethodgetModifiers {
public static void main(String[] args) {
try {
MyClass a = new MyClass();
Class c = a.getClass();
System.out.println("Public Methods:");
//得到所有类的方法
Method methods[] = c.getDeclaredMethods();
for (int i = 0; i < methods.length; i++) {
//得到方法的修饰符
int modifiers = methods[i].getModifiers();
if (Modifier.isPublic(modifiers)) {
System.out.println(" " + methods[i].getName());
}
}
} catch (Exception e) {
System.out.println("Exception: " + e);
}
}
}
class MyClass {
public void a1() {}
public void a2() {}
protected void a3() {}
private void a4() {}
}
主要经验值获得:
1.java.lang.reflect.Method 作用
2.java.lang.reflect.Modifier 作用
---------------------------------------------------------------------------------------------
4. Method_Invoke
/**//*
输出:
public void api.java.lang.reflect.MyClass2.print(java.lang.String,int)
inovke succeed:haha10
*/
package api.java.lang.reflect;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Method_Invoke {
public static void main(String[] args) {
try {
MyClass2 myclass = new MyClass2();
Class c = myclass.getClass();
Class[] cc = new Class[2];
cc[0] = String.class;
cc[1] = Integer.TYPE;
/**//*
* getMethod(String,Class[] 返回一个 Method 对象,它反映此 Class
* 对象所表示的类或接口的指定公共成员方法。name 参数是一个 String,用于指定所需方法的简称。parameterTypes
* 参数是按声明顺序标识该方法形式参数类型的 Class 对象的一个数组。如果 parameterTypes 为
* null,则按空数组处理。
*/
Method m = c.getMethod("print", cc);
System.out.println(m);
Object arglist[] = new Object[2];
arglist[0] = new String("haha");
arglist[1] = new Integer(10);
/**//*
* Object invoke(Object, Object[])
* Object - 从中调用基础方法的对象
* Object[] - 用于方法调用的参数
*/
m.invoke(myclass, arglist);
} catch (NoSuchMethodException e2) {
System.out.println("method doesn't exist");
} catch (IllegalAccessException e3) {
System.out.println("no permission to invoke that method");
} catch (InvocationTargetException e) {
System.out
.println("an exception ocurred while invoking that method");
System.out.println("Method threw an: " + e.getTargetException());
}
}
}
class MyClass2 {
public void print(String str, int i) {
System.out.print("inovke succeed:" + str + i);
}
}
主要经验值获得:
1.java.lang.reflect.Method 的 invoke() 的作用
---------------------------------------------------------------------------------------------
5.Class_ParameterizedType/**//*
输出:
java.util.ArrayList<java.lang.String>
class java.lang.String
*/
package api.java.lang.reflect;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
public class Class_ParameterizedType {
/** *//**
* @param args
*/
public static void main(String[] args) {
Type type = StringList.class.getGenericSuperclass();
System.out.println(type);
ParameterizedType pt = (ParameterizedType) type;
System.out.println(pt.getActualTypeArguments()[0]);
}
}
class StringList extends ArrayList<String> {
}
主要经验值获得:
1.如何得到泛型以及其ActualTypeArguments
---------------------------------------------------------------------------------------------
6.