标签:
//java反射机制
允许运行中的 java程序对自身进行检测,
可以直接操作程序内部的属性
Class类与java反射
Class类常用方法
//强制转换Class对象,以表示指定的类对象所表示的类的一个子集
public <U> Class<? extends U> asSubclass(Class <U> clazz)
//将一个对象强制转换成此 Class对象所表示的类或接口
public T cast(Object obj)
.....
//使用Object类中的getClass()方法
package org.com.classdemo;
class SuperClass
{
public void show()
{
System.out.println("这是SuperClass类的show()方法");
}
}
class SubClass extends SuperClass
{
public void show()
{
System.out.println("这是SubClass类的show()方法");
}
}
public class Hi
{
public static void main(String[] args)
{
SuperClass sup = new SuperClass();
SubClass sub = new SubClass();
Class c1 = sup.getClass();
Class c2 = sub.getClass();
System.out.println("类名:"+c1.getName());
System.out.println("类名:"+c2.getName());
}
}
编译: javac -d . Hi.java
运行:java org.com.classdemo.Hi
/*
类名:org.com.classdemo.SuperClass
类名:org.com.classdemo.SubClass
*/
// ============
//使用 forName()方法加载对象
//其中forName()返回的是Class实例,不是所加载类的实例
package org.com.classdemo;
class LocaderClass
{
static
{
System.out.println("这是LocaderClass类的静态代码块");
}
}
public class Hi
{
public static void main(String[] args)
{
Class c = null;
try
{
// 加载LocaderClass对象
c = Class.forName("org.com.classdemo.LocaderClass");
}catch(ClassNotFoundException e)
{
e.printStackTrace();
}
// 输出对象所在类的名称
System.out.println("类名:"+c.getName());
}
}
/*
E:\javap>javac -d . Hi.java
E:\javap>java org.com.classdemo.Hi
这是LocaderClass类的静态代码块
类名:org.com.classdemo.LocaderClass
*/
// -------------
使用用类标记
package org.com.classdemo;
class LocaderClass
{
static
{
System.out.println("这是locaderclass类的静态代码块");
}
}
public class Hi
{
public static void main(String[] args)
{
// 声明Class对象 c
Class c = LocaderClass.class;
System.out.println("类名:"+c.getName());
}
}
/*
E:\javap>javac -d . Hi.java
E:\javap>java org.com.classdemo.Hi
类名:org.com.classdemo.LocaderClass
*/
// ===============
使用反射机制生成并操作对象
通过无参构造实例化对象
package org.com.classdemo;
class Student
{
private String name;
private int age;
public Student(){}
public void setName(String name)
{
this.name = name;
}
public String getName()
{
return name;
}
public void setAge(int age)
{
this.age = age;
}
public int getAge()
{
return age;
}
public String toString()
{
return "姓名:"+getName()+",年龄:"+getAge();
}
}
public class Hi
{
public static void main(String[] args)
{
// 定义 Class对象
Class<?> c = null;
// 定义 Student 对象
Student stu = null;
try
{
// 加载LocaderClass对象,必须要完整的,包.类名
c = Class.forName("org.com.classdemo.Student");
}catch(ClassNotFoundException e)
{
e.printStackTrace();
}
try
{
//向下转型为 Student对象
stu = (Student)c.newInstance();
}catch(InstantiationException e)
{
e.printStackTrace();
}catch(IllegalAccessException e)
{
e.printStackTrace();
}
stu.setName("小二");
stu.setAge(20);
System.out.println("对象信息:"+stu);
}
}
/*
E:\javap>javac -d . Hi.java
E:\javap>java org.com.classdemo.Hi
对象信息:姓名:小二,年龄:20
*/
// ============
调用有参构造方法
提供了使用java.lang.reflect.Constructor类根据类的
指定构造方法创建对象.使用Constructor类操作时,根据明确地
调用类中的构造方法,并将参数传递进去,即可实例化操作
具体如下:
获取类 Class对象,再通过 Class类中的 getConstructor()方法
取得Constructor类的实例
通过Constructor类的实例,调用 newInstance()方法并传
入指定构造方法所需要的参数创建对象
调用类中指定的构造方法
package org.com.classdemo;
import java.lang.reflect.Constructor;
class Student
{
private String name;
private int age;
// 必须显示写无构构造方法
public Student()
{
this.name = "小二";
this.age = 21;
}
// 必须显示写无构构造方法
public Student(String name)
{
this.name = name;
}
public Student(String name, int age)
{
this.name = name;
this.age = age;
}
public Student(int age)
{
this.age = age;
}
public void setName(String name)
{
this.name = name;
}
public String getName()
{
return name;
}
public void setAge(int age)
{
this.age = age;
}
public int getAge()
{
return age;
}
public String toString()
{
return "姓名:"+getName()+",年龄:"+getAge();
}
}
public class Hi
{
public static void main(String[] args)
{
Class<?> c = null;
Student stu1 = null;
Student stu2 = null;
Student stu3 = null;
Student stu4 = null;
Constructor<?> con[] = null;
try
{
// 加载LocaderClass对象
c = Class.forName("org.com.classdemo.Student");
}catch(ClassNotFoundException e)
{
e.printStackTrace();
}
// 实例化Constructor
con = c.getConstructors();
for(int i=0; i<con.length;i++)
{
// 输出con数组,代表各个构造方法
System.out.println(i+"--------"+con[i]);
}
try
{
stu1 = (Student) con[0].newInstance(20);
stu2 = (Student) con[1].newInstance("小二",21);
stu3 = (Student) con[2].newInstance("小一");
stu4 = (Student) con[3].newInstance();
}catch(Exception e)
{
e.printStackTrace();
}
System.out.println("对象信息1:"+stu1);
System.out.println("对象信息2:"+stu2);
System.out.println("对象信息3:"+stu3);
System.out.println("对象信息4:"+stu4);
}
}
/*
E:\javap>javac -d . Hi.java
E:\javap>java org.com.classdemo.Hi
0--------public org.com.classdemo.Student(int)
1--------public org.com.classdemo.Student(java.lang.String,int)
2--------public org.com.classdemo.Student(java.lang.String)
3--------public org.com.classdemo.Student()
对象信息1:姓名:null,年龄:20
对象信息2:姓名:小二,年龄:21
对象信息3:姓名:小一,年龄:0
对象信息4:姓名:小二,年龄:21
*/
// ==============
反射机制的应用
反射机制主要运用java.lang.reflect包,这个包常用的类有:
Constructor类:用于表示类中的构造方法
Field类:用于表示类中的成员属性
Method类:用于表示类中的成员方法
//获取类所实现的全部接口
package org.com.classdemo;
interface FirstInterface{}
interface SecondInterface{}
interface ThirdInterface{}
class Demo implements FirstInterface,SecondInterface,ThirdInterface
{
}
public class Hi
{
public static void main(String[] args)
{
// 定义Class类型的数组
Class<?> inter[] = null;
try
{
// 获取全部实现的接口
inter = Class.forName("org.com.classdemo.Demo").getInterfaces();
}catch(ClassNotFoundException e)
{
e.printStackTrace();
}
for(Class<?> c:inter)
{
System.out.println(c.getName());
}
}
}
/*
E:\javap>javac -d . Hi.java
E:\javap>java org.com.classdemo.Hi
org.com.classdemo.FirstInterface
org.com.classdemo.SecondInterface
org.com.classdemo.ThirdInterface
*/
// ==============
获取父类
通过 Class类的 getSuperclass()方法获取一个类的父类,再通过getName()方法返回父类的名称
package org.com.classdemo;
class SuperClass
{
}
class SubClass extends SuperClass
{
}
public class Hi
{
public static void main(String[] args)
{
Class<?> c1 = null;
Class<?> c2 = null;
try
{
// 实例化 Class
c1 = Class.forName("org.com.classdemo.SubClass");
c2 = Class.forName("org.com.classdemo.SuperClass");
}catch(ClassNotFoundException e)
{
e.printStackTrace();
}
// 取得父类的名称
System.out.println("SubClass的父类:"+c1.getSuperclass().getName());
System.out.println("SuperClass父类:"+c2.getSuperclass().getName());
}
}
/*
E:\javap>javac -d . Hi.java
E:\javap>java org.com.classdemo.Hi
SubClass的父类:org.com.classdemo.SuperClass
SuperClass父类:java.lang.Object
*/
// =============
访问成员变量
Class类中提供了一系列的方法可以访问类中的全部属性,
并返回Field对象或数组
标签:
原文地址:http://www.cnblogs.com/lin3615/p/4354311.html