广州疯狂软件教育Java培训,iOS培训分享
Class类是Reflection
API中核心的类,他位于java.lang.Class
列出一些常用的方法。
- getName() :
获得类的完整名字
- getFields() : 获得类的public类型的属性
- getDeclaredFields()
: 获得类的所有属性
- getMethods() : 获得类的public类型的方法
-
getDeclaredMethods() : 获得类的所有方法
- getMethod(String name, Class[]
parameterTypes) :
获取类的特定方法(name参数指定方法名字,parameterTypes参数指定方法参数类型)
-
getConstructors() : 获得类的public类型的构造方法
- getConstructor(Class[]
parameterTypes) : 获得类的特定构造方法(parameterTypes参数指定构造方法的参数类型)
-
newInstance() :
通过类的不带参数的构造方法创建这个类的一个对象
如果想使用反射,有2个关键的部分
1.获取Class对象
2.获得对象实例
下面来介绍这两个部分:
1.如何获取Class对象
获取某个类或某个对象所对应的Class对象的常用的3种方法
a)
使用Class类的静态方法forName:
Class.forName("java.lang.String");
b)
使用类的.class语法:
String.class;
c)
使用对象的getClass()方法(java.lang.Object类中的方法):
String s =
"aa";
Class<?> clazz =
s.getClass();
2.如何获得对象实例
大家都知道获得对象实例就是去new一个,其实就是调用对象的构造方法
这里将调用构造方法参数的不同分为两种类型:
a)调用无参数的构造方法:
1.调用Class对象的newInstance()方法:
Class<?>
classType=ClassClass.forName("java.lang.String");
Object object =
classTpye.newInstance();
2.调用Class对象的Constructor对象的newInstance()方法,传递一个空的Class对象数组作为参数:
Class<?>
classType=ClassClass.forName("java.lang.String");
Constructor
cons = classType.getConstructor(new Class[]{});
Object object
=cons.newInstance(new
Object[]{});
b)调用有参数的构造方法:
1.调用Class对象的Constructor对象的newInstance()方法,传递一个可变长的Class对象数组作为参数,本例传递String,int两个参数:
Class<?>
classType=ClassClass.forName("java.lang.String");
Constructor
cons = classType.getConstructor(new Class[]{String.class,
int.class});
Object object = cons.newInstance(new
Object[]{"hello",3});
下面来一个小Demo,由于过于简单这里就只贴代码了
这个demo简单的实现了上面介绍的一些关于反射的用法,算是一个复习巩固:
class
Person {
private long id;
private int age;
private
String name;
public Person()
{
}
public Person(String
name, int age) {
this.name =
name;
this.age =
age;
}
@Override
public String
toString() {
return
"Name="+getName()+" Age="+getAge()+"
Id="+getId();
}
public long getId()
{
return id;
}
public void setId(long id) {
this.id =
id;
}
public int getAge() {
return
age;
}
public void setAge(int age) {
this.age =
age;
}
public String getName() {
return
name;
}
public void setName(String name) {
this.name
= name;
}
}
很简单的一个自定义类,两个构造方法,和一些get,set方法,还有一个重写的toString
下面是调用反射的main方法中的代码,主要就是用反射的方法调用Person的带参构造方法给age,name赋值,在调用setId给id赋值,最后调用toString方法打印出结果
public
static void main(String[] args) throws Exception
{
//获取Person类的Class对象
Class<?>
classType =
Class.forName("Person");
//调用Person类的两个参数构造方法生成对象
Constructor
constructor = classType.getConstructor(new Class[]
{String.class, int.class});
Object object =
constructor.newInstance(new
Object[]{"Dean",25});
//获取setId方法
Method
setId = classType.getMethod("setId", new
Class[]{long.class});
//调用setId方法设置Id
setId.invoke(object,
new
Object[]{10})
//调用toString输出结果
Method
toString = classType.getMethod("toString", new
Class[]{});
String result = (String)
toString.invoke(object, new
Object[]{});
System.out.println(result);
}
输出结果为:Name=Dean Age=25
Id=10
疯狂Java培训专注软件开发培训,提升学员就业能力,重点提升实践动手能力。高薪从IT名企请来项目经理为学员亲自授课,对学员进行实战教学,在没有工作经验的学员,在疯狂java,通过大量全真经典企业级项目进行集中培训,学员通过数月培训都可获得1-2年的工作经验,进而在同类的求职者中脱颖而出。疯狂Java培训让你体会java编程的快乐,项目开发的兴奋,成就感,通过短短几个月的时间,让你在半年的时间内掌握8-10万的代码量,掌握Java核心技术,迅速成为技能型的现代化高端人才,迅速获得高薪就业!