反射(未完待续)

在线API : http://tool.oschina.net/apidocs/apidoc?api=jdk-zh


获得类对象

类对象只有一个,因为类对象保存在方法区(保存static的地方)

第一种

会执行静态语句块

Class 你要获得的 = Class.forName(你要获得的类的名);

第二种

不会执行静态语句块

Class 你要获得的 = 你要获得的类的名.class;

第三种

你要获得的类的名 临时名 =new 你要获得的类的名();
Class 你要获得的 = 临时名.getClass();

获得属性


public class UserInfo {

    public String name;
    protected String protected_variable;
    private String age;
    boolean sex;
    private static String ID ;
    private final String Gene = "AGCT";

}


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

public class MyReflect {

    public static void main(String[] args) throws ClassNotFoundException {
        Class the_userInfo =Class.forName("UserInfo");

        Field[] get_variable;
        System.out.println("只能获得公有属性");
        get_variable=the_userInfo.getFields();
        System.out.println(get_variable.length);
        System.out.println(get_variable[0].getName());

        System.out.println("获得所有类型");
        get_variable = the_userInfo.getDeclaredFields();
        for (Field f:get_variable){
            System.out.println(f.getName()+" : "+f.getType().getSimpleName()+" : "+f.getType());
        }
        System.out.println("获得所有修饰");
        for (Field f:get_variable){
            System.out.println(f.getName()+" : "+f.getModifiers()+" : "+Modifier.toString(f.getModifiers()));
        }

    }

}

输出结果:

只能获得公有属性
1
name
获得所有类型
name : String : class java.lang.String
protected_variable : String : class java.lang.String
age : String : class java.lang.String
sex : boolean : boolean
ID : String : class java.lang.String
Gene : String : class java.lang.String
获得所有修饰
name : 1 : public
protected_variable : 4 : protected
age : 2 : private
sex : 0 :
ID : 10 : private static
Gene : 18 : private final


打印类结构


    public static void main(String[] args) throws ClassNotFoundException {

        String class_name = "UserInfo";

        Class a_class =Class.forName(class_name);//获得类对象
        StringBuffer sb =new StringBuffer();

        sb.append(Modifier.toString(a_class.getModifiers())+" class "+a_class.getSimpleName()+"{\n");// 输出 :修饰 class 类名

//        输出属性部分
        Field[] fields = a_class.getDeclaredFields();
        for(Field field:fields){
            sb.append("\t");
            sb.append(Modifier.toString(field.getModifiers()));//获得修饰字符
            sb.append(" ");
            sb.append(field.getType().getSimpleName());//获得类型名
            sb.append(" ");
            sb.append(field.getName());//获得变量名
            sb.append(";\n");
        }
//        输出方法部分
        Method[] methods=a_class.getDeclaredMethods();
        for(Method method:methods){
            sb.append("\t");
            sb.append(Modifier.toString(method.getModifiers()));//获得修饰字符
            sb.append(" ");
            sb.append(method.getReturnType().getSimpleName());//获得类型名
            sb.append(" ");
            sb.append(method.getName());//获得方法名
            sb.append("(");
//            参数
            Class[] parameter_types =method.getParameterTypes();
            for (int i=0;i<parameter_types.length;i++){
                Class parameter_type=parameter_types[i];
                sb.append(parameter_type.getSimpleName());
                if(1<parameter_types.length-i){
                    sb.append(",");
                }
            }
            sb.append("){}\n");
        }
        sb.append("}\n");//类大括号结束
        //打印查看
        System.out.println(sb);

    }






猜你喜欢

转载自blog.csdn.net/yup1212/article/details/81000372