每天学点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包.有时候可以检查包是否导入正确来排除一些问题