Name、SuperClass、Constructor、Field、Method

来源:互联网 发布:php is numeric 漏洞 编辑:程序博客网 时间:2024/05/17 10:52


 

Name

SuperClass

Constructor

Field

Method

获取

getName

getSimpleName

getSuperClass

getConstructor

getDeclaredConstructor+setAccessible

getConstructors

getField

getDeclaredFields+setAccessible

getFields

 

使用

 

 

(Class) newInstance

set

set*

get

get*

invoke

getXgetXs都只能获取public的构造函数、成员变量、成员函数。

如果需要使用protected/private的,需要使用getDeclaredX+setAccessible()禁用安全检查。

 

此外,对于静态元素,使用的时候第一个参数objectnull即可。

 Java Code 

 

package com.bjsxt.test;

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

import com.bjsxt.test.bean.User;

public class Test {

    
public static void main(String[] args) {
        
        
String path="com.bjsxt.test.bean.User";
        
        
try {
            Class<?> clazz = Class.forName(path);
            System.out.println(clazz.getName());
            System.out.println(clazz.getSimpleName());
            clazz.getSuperclass();
            
            
//获取所有public的构造函数
            Constructor<?>[] constructors = clazz.getConstructors();
            
for (Constructor<?> constructor2 : constructors) {
                System.out.println(constructor2);
            }
            
            Constructor<?> constructor = clazz.getDeclaredConstructor(
int.classint.classString.class );
            User user=(User)constructor.newInstance(
118"shadowfaxghh");
            System.out.println(user.getUname());
            
            
//也可以直接使用class.newInstance(),此时会调用默认的无参构造方法,因为此时为private,故会报java.lang.IllegalAccessException
//          User user2=(User)clazz.newInstance();
            
            Field declaredField = clazz.getDeclaredField(
"uname");
            declaredField.setAccessible(true);
            declaredField.set(user, 
"abcde");
            System.out.println(declaredField.get(user));
            
            Method declaredMethod = clazz.getDeclaredMethod(
"setUname"String.class);
            declaredMethod.invoke(user, 
"xxx");
            declaredMethod.setAccessible(true);
            System.out.println(user.getUname());
            
        } 
catch (ClassNotFoundException e) {
            e.printStackTrace();
        } 
catch (NoSuchMethodException e) {
            e.printStackTrace();
        } 
catch (SecurityException e) {
            e.printStackTrace();
        } 
catch (InstantiationException e) {
            e.printStackTrace();
        } 
catch (IllegalAccessException e) {
            e.printStackTrace();
        } 
catch (IllegalArgumentException e) {
            e.printStackTrace();
        } 
catch (InvocationTargetException e) {
            e.printStackTrace();
        } 
catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
    }

}

 


 

0 0