每天学点java_反射作用

package com.czj;

import java.util.List;

public class Person {

    String str= "";
    public Person() {
        System.out.println("person 空构造函数");
    }

    public Person(String str ) {
        System.out.println(str);
    }
    
    public Person(String str,int i ) {
        System.out.println(str+":"+i);
    }
    
    private Person(List list){
            System.out.println("list");
    }
    
    
    public void out(){
        System.out.println("调用out()方法,为空");
    }
    
    public Class[] out(String name,int password){
        System.out.println(name+":"+password);
        return new Class[] {};
    }
    
    private void out(String name){
        System.out.println(name);
    }
}





package com.czj;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

public class Demo {
    /*
     * 反射机制, 创建类的对象; 获取类里面的 属性;方法;构造函数;
     */
    public void test() throws Exception{
        //1
        Class class1=Class.forName("com.czj.Person");
        //2
        Class class2=Person.class;
        //3
        Class class3=new Person().getClass();
        
    }
    //1;调用无参构造函数
    public void run1() throws Exception{
        Class clazz=Class.forName("com.czj.Person");
        
        Constructor e= clazz.getConstructor(null);//调用为空的够早函数; 如果有参数的就把null改为类似   类.class(String.class);
        Person p=(Person) e.newInstance(null);//返回一个object对象所以要强制转换,如果有参数的就把null改为属性值;
        System.out.println(p.str);
        
    }
    //2;构造有一个参数的构造函数; String.class
    public void run2() throws Exception{
        Class clazz=Class.forName("com.czj.Person");
        
        Constructor e= clazz.getConstructor(String.class);//调用为空的够早函数; 如果有参数的就把null改为类似   类.class(String.class);
        Person p=(Person) e.newInstance("参数string");//返回一个object对象所以要强制转换,如果有参数的就把null改为属性值;
        System.out.println(p.str);
        
    }
    //调用有多个参数的构造函数
    public void run3() throws Exception{
        Class clazz=Class.forName("com.czj.Person");
        
        Constructor e= clazz.getConstructor(String.class,int.class);//调用为空的够早函数; 如果有参数的就把null改为类似   类.class(String.class);
        Person p=(Person) e.newInstance("参数string",10);//返回一个object对象所以要强制转换,如果有参数的就把null改为属性值;
        System.out.println(p.str);
        
    }
    //调用私有的构造函数
    public void run4() throws Exception{
        Class clazz=Class.forName("com.czj.Person");
        
        Constructor e= clazz.getDeclaredConstructor(List.class);//调用为私有的函数; 用到getDeclaredConstructor
        e.setAccessible(true);//暴力破解,如果是private一样能访问到里面的东西;
        Person p=(Person) e.newInstance(new ArrayList());//返回一个object对象所以要强制转换,如果有参数的就把null改为属性值;
        System.out.println(p.str);
        
    }
    
    public void go() throws Exception{
        Person p=new Person();
        Class clazz=Class.forName("com.czj.Person");
        Method method=clazz.getMethod("out", String.class,int.class);//第一个参数值为方法名, 第二个为参数类型;
        method.invoke(p, "调用带2个参数的方法",10);
        
    }
    public void go1() throws Exception{
        Person p=new Person();
        Class clazz=Class.forName("com.czj.Person");
        Method method=clazz.getDeclaredMethod("out",String.class);//第一个参数值为方法名, 第二个为参数类型,可以有多个参数类型;
        method.setAccessible(true);//暴力获取私有权限;  私有方法获取用declaredmethod.
        method.invoke(p, "调用带2个参数的方法");
        
    }
    
    
    
    
    public static void main(String []args) throws Exception{
        Demo demo=new Demo();
/*            demo.run1();
            demo.run2();
            demo.run3();
            demo.run4();*/
        
        demo.go1();
    }
    

}




调用私有的反射时, 第一次忘记是getDeclaredConstructor()方法; 还有java报运行错误; 因为List.class我使用的java.awt.list包.有时候可以检查包是否导入正确来排除一些问题

原文地址:https://www.cnblogs.com/JohnChen-happy/p/4337086.html