您的位置:首页 > 编程语言 > Java开发

Java的反射机制

2016-05-28 18:02 543 查看


Java的反射机制


什么是反射

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制


如何使用

Person 类
public class Person {

public String name;  //字段或成员变量
private int age;
public final String password = "123";  //字段或成员变量

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public Person(){
//System.out.println("person!!!!!");
}

public Person(String name){
System.out.println(name);
}

private Person(int name){
System.out.println(name);
}

public void eat(){
System.out.println("eat!!!!");
}

public void run(String address){
System.out.println("跑到" + address);
}

public void run(String address,int num[],String ss[]){
System.out.println("跑到" + address + "," + num);
}

public String test(String str){

return str + "aaaa";
}

private String test2(String str){

return str + "aaaa";
}

public static String test3(String str){

return str + "aaaa";
}

public static void main(String[] args) {
System.out.println(args[0]);
}
}

加载字节码的三种方法(获取类)
//第一种
Class clazz1 = Class.forName("cn.csx.reflect.Person");

//第二种
Class clazz2 = Person.class;
//第三种
Class clazz3 = new Person().getClass();
//创建对象
Person p = (Person) clazz1.newInstance();

利用Constructor创建对象

反射类无参的构造方法

//反射类无参的构造方法
@Test
public void test1() throws ClassNotFoundException,
NoSuchMethodException, InstantiationException,
IllegalAccessException, InvocationTargetException {

Class clazz = Class.forName("cn.csx.reflect.Person");

Constructor c = clazz.getConstructor(null);

Object obj = c.newInstance(null);

System.out.println(obj);
}


反射类有参的构造方法:public Person(String name)

//反射类有参的构造方法:public Person(String name)
@Test
public void test2() throws ClassNotFoundException,
NoSuchMethodException, InstantiationException,
IllegalAccessException, InvocationTargetException {

Class clazz = Class.forName("cn.csx.reflect.Person");

Constructor c = clazz.getConstructor(String.class);

Person p = (Person) c.newInstance("flx");

System.out.println(p);
}


反射类私有的、有参的构造方法:private Person(int name)(暴力反射)

//反射类私有的、有参的构造方法:private Person(int name)
@Test
public void test3() throws ClassNotFoundException,
NoSuchMethodException, InstantiationException,
IllegalAccessException, InvocationTargetException {

Class clazz = Class.forName("cn.csx.reflect.Person");

Constructor c = clazz.getDeclaredConstructor(int.class);
c.setAccessible(true);//暴力反射
Person p = (Person) c.newInstance(1);
System.out.println(p);
}


反射方法

public class Demo3 {
//反射方法

//反射:public void eat()
@Test
public void test1() throws Exception{

Person p = new Person();  //
Class clazz = Class.forName("cn.csx.reflect.Person");  //完整名称
Method method = clazz.getMethod("eat", null);  //eat
method.invoke(p, null);  //eat
}

//反射:run(String address){
@Test
public void test2() throws Exception{

Person p = new Person();  //

Class clazz = Class.forName("cn.csx.reflect.Person");  //完整名称
Method method = clazz.getMethod("run", String.class);
method.invoke(p, "北京");

}

//反射:public void run(String address,int num[],String ss[]){
@Test
public void test3() throws Exception{

Person p = new Person();  //

Class clazz = Class.forName("cn.csx.reflect.Person");  //完整名称
Method method = clazz.getMethod("run", String.class,int[].class,String[].class);
method.invoke(p, "上海",new int[]{1,2},new String[]{"1","2"});
}

//反射:public String test(String str) (带返回值)
@Test
public void test4() throws Exception{

Person p = new Person();  //

Class clazz = Class.forName("cn.csx.reflect.Person");  //完整名称
Method method = clazz.getMethod("test", String.class);
String result = (String) method.invoke(p, "xxxx");
System.out.println(result);
}

//反射:private String test2(String str)  私有方法
@Test
public void test5() throws Exception{

Person p = new Person();  //
Class clazz = Class.forName("cn.csx.reflect.Person");  //完整名称
Method method = clazz.getDeclaredMethod("test2", String.class);
method.setAccessible(true);
method.invoke(p, "");
}

//反射:public static String test3(String str){ 静态方法
@Test
public void test6() throws Exception{

Class clazz = Class.forName("cn.csx.reflect.Person");  //完整名称

Method method = clazz.getMethod("test3", String.class);
String result = (String) method.invoke(null, "aaa");
System.out.println(result);

}

//反射:public static void main(String[] args) {  反射main方法
//通过反射调用带数组的方法,要注意处理
@Test
public void test7() throws Exception{

Class clazz = Class.forName("cn.csx.reflect.Person");  //完整名称

Method method = clazz.getMethod("main", String[].class);
method.invoke(null, (Object)new String[]{"1","2"});//main(String args[])
//method.invoke(null, new Object[]{new String[]{"1","2"}});//main(String args[])

//public Object invoke(Object obj, Object... args)  //jdk1.5
//public Object invoke(Object obj, Object[] args)  //jdk1.4

//public void run(String name,String password)
//method.invoke(p,new Object[]{"flx,123"})//1.4
//method.invoke(p,"flx","123");
}
}


反射类的字段

public class Demo4 {

/**反射类的字段
* @param args
* @throws Exception
*/

//反射:public String name;
@Test
public void test1() throws Exception{

Person p = new Person();

Class clazz = Class.forName("cn.csx.reflect.Person");

Field f = clazz.getField("name");  //name

f.set(p, "flx");

System.out.println(p.getName());

}

//反射:public String name;
@Test
public void test2() throws Exception{

Person p = new Person();
p.setName("xxx");

Class clazz = Class.forName("cn.csx.reflect.Person");
Field f = clazz.getField("name");  //name
String result = (String) f.get(p);
System.out.println(result);

}

//反射:public final String password = "";  //字段或成员变量
@Test
public void test3() throws Exception{

Person p = new Person();

Class clazz = Class.forName("cn.csx.reflect.Person");
Field f = clazz.getField("password");  //name
String result = (String)f.get(p);
System.out.println(result);

}
//反射:private int age; 私有字段
@Test
public void test4() throws Exception{

Person p = new Person();

Class clazz = Class.forName("cn.csx.reflect.Person");
Field f = clazz.getDeclaredField("age");
f.setAccessible(true);

f.set(p, 123);

int result = (Integer) f.get(p);
System.out.println(result);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  反射 java class