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

java反射实例

2015-06-08 21:45 381 查看

一、定义类

package aa;

import java.util.Date;

public class Person {
public String name="啦啦啦";
private int age = 18;
public static Date time;
public int getAge() {
return age;
}

public Person(){
System.out.println("默认构造方法");
}

public Person(String name){
System.out.println("姓名:"+name);
}

public Person(String name,int age){
System.out.println(name+"---"+age);
}

private Person(int age){
System.out.println("年龄"+age);
}

public void m1(){
System.out.println("调用了m1方法。。");
}

public void m2(String name){
System.out.println("调用了m2方法。。"+name);
}

public String m3(String name,int age){
System.out.println("调用了m3方法。。"+name+"---"+age);
return "aaaaa";
}

private void m4(Date d){
System.out.println(d);
}

public static void m5(){
System.out.println("m5");
}
public static void m6(String[] strs){
System.out.println("m6   "+strs.length);
}

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


二、反射构造方法

package aa;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Date;

import org.junit.Test;
//反射
@SuppressWarnings(value="all")
public class Demo3 {

//-----反射构造方法-----
@Test //public Person(){
public void test01() throws Exception {
//1.
Class clazz = Class.forName("aa.Person"); //获取类的字节码
//      Person p = new Person();
//2.Class clazz = p.getClass();
//3.Class clazz = Person.class;
Constructor c = clazz.getConstructor(null); //构造方法的参数
c.newInstance(null);
}

@Test //public Person(String name){
public void test02() throws Exception {
Class clazz = Class.forName("aa.Person");
Constructor c = clazz.getConstructor(String.class);
c.newInstance("李四");
}

@Test //public Person(String name,int age)
public void test03() throws Exception {
Class clazz = Class.forName("aa.Person");
Constructor c = clazz.getConstructor(String.class,int.class);
c.newInstance("李四",25);

Person p = (Person)c.newInstance("李四",25);
System.out.println(p.name);
}

@Test //private Person(int age){
public void test04() throws Exception {
Class clazz = Class.forName("aa.Person");
Constructor c = clazz.getDeclaredConstructor(int.class);
c.setAccessible(true); //暴力反射
c.newInstance(25);
}

@Test
public void test05() throws Exception {
Class clazz = Class.forName("aa.Person");
Constructor[] cs = clazz.getDeclaredConstructors();
//遍历所有构造方法
for(Constructor c:cs){
System.out.println(c);
}
System.out.println("构造方法的个数:  "+cs.length);
}

@Test
public void test06() throws Exception {
Class clazz = Class.forName("aa.Person");
Person p =(Person) clazz.newInstance();//默认构造方法
System.out.println(p.name);
}

//---------以上是反射构造方法---------------


三、反射方法

//---------以下是反射方法------------------
@Test //public void m1()
public void test10() throws Exception {
Class clazz = Class.forName("aa.Person");
Person p = (Person)clazz.newInstance();
Method m = clazz.getMethod("m1", null);//方法的名称,方法的参数
m.invoke(p, null); //参数一:对象 ,参数二:参数
}

@Test //public void m2(String name)
public void test11() throws Exception {
Class clazz = Class.forName("aa.Person");
Person p = (Person)clazz.newInstance();
Method m = clazz.getMethod("m2", String.class);//方法的名称,方法的参数类型
m.invoke(p, "张三"); //参数一:对象 ,参数二:参数
}

@Test //public String m3(String name,int age){
public void test12() throws Exception {
Class clazz = Class.forName("aa.Person");
Person p = (Person)clazz.newInstance();
Method m = clazz.getMethod("m3", String.class,int.class);
String value = (String)m.invoke(p, "张三",20);
System.out.println(value);
}

@Test //private void m4(Date d){
public void test13() throws Exception {
Class clazz = Class.forName("aa.Person");
Person p = (Person)clazz.newInstance();
Method m = clazz.getDeclaredMethod("m4", Date.class);
m.setAccessible(true);
m.invoke(p, new Date());
}

@Test //public static void m5(){
public void test15() throws Exception {
//方法一:
//      Class clazz = Class.forName("aa.Person");
//      Person p = (Person)clazz.newInstance();
//      Method m = clazz.getMethod("m5",null);
//      m.invoke(p, null);
//方法二:
Class clazz = Class.forName("aa.Person");
Method m = clazz.getMethod("m5",null);
m.invoke(null, null);
}

@Test //public static void m6(String[] strs){
public void test16() throws Exception {
//方法一:
Class clazz = Class.forName("aa.Person");
Person p = (Person)clazz.newInstance();
Method m = clazz.getDeclaredMethod("m6",String[].class);
m.setAccessible(true);
//  m.invoke(null, new Object[]{new String[]{"1","2"}}); //以下两个都可以
//  m.invoke(null, (Object)new String[]{"1","2"});
m.invoke(null, new String[]{"1","2"});
//  java.lang.IllegalArgumentException: wrong number of arguments

}


这个比较重要:



如果在test16方法里直接调用这行代码就会

m.invoke(null, new String[]{“1”,”2”});出现如图所示的错误



@Test //public static void main(String[] strs){
public void test17() throws Exception {
Class clazz = Class.forName("aa.Person");
Person p = (Person)clazz.newInstance();
Method m = clazz.getMethod("main",String[].class);
m.invoke(null, new Object[]{new String[]{"1","2"}});
}


四、反射字段

//---------以下是反射字段------------
@Test //public String name="传智博客";
public void test20() throws Exception {
Class clazz = Person.class;
Person p = (Person)clazz.newInstance();
Field f = clazz.getField("name");
String s = (String)f.get(p);
System.out.println(s);

f.set(p,"上海传智");
System.out.println(p.name);
}

@Test //private int age = 18;
public void test21() throws Exception {
Class clazz = Person.class;
Person p = (Person) clazz.newInstance();
Field f = clazz.getDeclaredField("age");
f.setAccessible(true);
int age = (Integer)f.get(p);
System.out.println(age);

f.set(p,20);
age = (Integer)f.get(p);
System.out.println(age);
}

@Test //public static Date time;
public void test22() throws Exception {
Class clazz = Person.class;
Field f = clazz.getField("time");
f.set(null, new Date());
System.out.println(Person.time);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java