小方的Java博客

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  27 随笔 :: 17 文章 :: 115 评论 :: 0 Trackbacks
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.
posted on 2006-08-15 14:09 方佳玮 阅读(2977) 评论(1)  编辑  收藏 所属分类: JAVA API 自学

评论

# re: [整理] java.lang.reflect 2008-09-12 09:41 的撒旦撒
不錯  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: