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

Java中的反射机制

2015-09-13 22:44 531 查看
反射定义:反射就是把Java累中的各个成分映射成Java对象,在使用的时候,,可以利用反射机制进行使用。

反射的作用:主要是用在框架里,被称为框架的“灵魂”。

反射原理:



一、访问反射构造方法

注:下面凡是访问到私有方法的时候,都需要用到:

<pre name="code" class="cpp"><span style="white-space:pre">		</span>//代表Reflection类的字节码对象
Class c=Class.forName("com.dp.java.Reflection.Reflection");
//得到Reflection构造方法
Constructor c1=c.getDeclaredConstructor(int.class);//得到含有int参数的私有构造方法?用来创建对象
c1.setAccessible(true)




public class Reflection_test {

/**
* 反射
*/
@Test
public void test1() throws Exception {
//代表Reflection类的字节码对象
Class c=Class.forName("com.dp.java.Reflection.Reflection");
//得到Reflection构造方法
Constructor c1=c.getConstructor(null);//得到没有参数的构造方法?用来创建对象
c1.newInstance(null);//创建了构造方法的对象
}

@Test
public void test2() throws Exception {
//代表Reflection类的字节码对象
Class c=Class.forName("com.dp.java.Reflection.Reflection");
//得到Reflection构造方法
Constructor c1=c.getConstructor(String.class);//得到含有string参数的构造方法?用来创建对象
c1.newInstance("Mr_Li13");//创建了构造方法的对象

}
@Test
public void test3() throws Exception {
//代表Reflection类的字节码对象
Class c=Class.forName("com.dp.java.Reflection.Reflection");
//得到Reflection构造方法
Constructor c1=c.getConstructor(String.class,int.class);//得到含有string参数的构造方法?用来创建对象
c1.newInstance("Mr_Li13",21);//创建了构造方法的对象

}
@Test
public void test4() throws Exception {
//代表Reflection类的字节码对象
Class c=Class.forName("com.dp.java.Reflection.Reflection");
//得到Reflection构造方法
Constructor c1=c.getDeclaredConstructor(int.class);//得到含有int参数的私有构造方法?用来创建对象
c1.setAccessible(true);
Reflection r=(Reflection) c1.newInstance(21);//创建了构造方法的对象
System.out.println(r.name);//访问类成员变量

}
public static void main(String[] args) throws Exception {
Reflection_test t1=new Reflection_test();
t1.test1();
t1.test2();
t1.test3();
t1.test4();
}
}


public class Reflection {
public String name="Mr_Li13的博客";
public Reflection() {
// TODO Auto-generated constructor stub
System.out.println(getClass().getName()+"类中默认的构造方法执行!");
}
public Reflection(String name) {
// TODO Auto-generated constructor stub
System.out.println("名字:"+name);
}
public Reflection(String gd,int age) {
// TODO Auto-generated constructor stub
System.out.println("年龄: "+age+"  成绩:"+gd);
}
private Reflection(int gz) {
// TODO Auto-generated constructor stub
System.out.println("工资: "+gz);
}
}




二、访问反射构造方法

public class Construction_function {
/**
* 反射中的普通方法访问
*/

@Test
public void test1() throws Exception{//未运行成功
Class c=Reflection.class;
Reflection R=(Reflection) c.newInstance();
Method m=c.getMethod("m1", null);//m1方法名称,方法的可变参数
m.invoke(R, null);

}

@Test
public void test2() throws Exception{
Class c=Reflection.class;
Reflection R=(Reflection) c.newInstance();
Method m=c.getMethod("m2", String.class);//m1方法名称,方法的可变参数
m.invoke(R, "李三");

}
@Test
public void test3() throws Exception{
Class c=Reflection.class;
Reflection R=(Reflection) c.newInstance();
Method m=c.getMethod("m3", String.class,int.class);//m1方法名称,方法的可变参数
m.invoke(R, "李三",23);

}

@Test
public void test4() throws Exception{//未运行成功
Class c=Reflection.class;
Reflection R=(Reflection) c.newInstance();
Method m=c.getDeclaredMethod("m4", Data.class);//m1方法名称,方法的可变参数
m.setAccessible(true);//强暴它强制运行
m.invoke(R,new Date());

}

@Test
public void test5() throws Exception{//访问公共静态方法
Class c=Reflection.class;
//Reflection R=(Reflection) c.newInstance();访问静态方法就不需要这个了
Method m=c.getMethod("m5", null);//m1方法名称,方法的可变参数
m.invoke(null, null);
}

}


public class Reflection {
public String name="Mr_Li13的博客";

/**
* 以下是普通方法
*/
private void m1() {
// TODO Auto-generated method stub
System.out.println("成绩:");

}
public void m2(String name) {
// TODO Auto-generated method stub
System.out.println("普通方法执行了!"+name);
}
public String m3(String name,int age) {
// TODO Auto-generated method stub
System.out.println("名字:"+name+"   年龄:"+age);
return null;

}
private void m4(Data d) {
// TODO Auto-generated method stub
System.out.println("时间:"+d);

}
public static void m5() {
// TODO Auto-generated method stub
System.out.println("公共静态方法执行了:");

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: