通过一个对象找到其所在的类,在Object类中存在以下的一个方法:
public final Class<?> getClass()所有类的对象都可以使用getClass()方法完成操作,那么这个方法返回的是一个Class,通过这个方法可以实现反射操作。
class Person
{
}
public class PersonClassDemo {
public static void main(String args[])
{
Person p1=new Person();
System.out.println(p1.getClass().getName());
}
}
在反射机制中Class类是一个操作的源头,所有的反射操作从此类展开,但是如果要想实例化此类对象可以通过以下的三个途径完成:
1,通过Object类中的getClass()方法:public final Class<?>getClass()
2,通过类.class的形式
3,通过Class类的静态方法:
public static Class<?> forName(String className)
class Person
{
}
public class PersonClassDemo {
public static void main(String args[])
{
Person per=new Person();
Class<?> c=per.getClass();
System.out.println(c.getName());
Class<?> c1=Person.class;
System.out.println(c1.getName());
try {
Class<?> c2=Class.forName("Person");
System.out.println(c2.getName());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
通过Class类实例化对象
如果一个类中存在一个无参构造方法,那么可以直接通过Class类进行实例化的操作。
步骤:
1,根据包.类名称实例化Class对象
2,通过Class类中的newInstance()方法来实例化对象。
class Person
{
public String getString()
{
return "hello world";
}
}
public class PersonClassDemo {
public static void main(String args[])
{
Class<?> c1=null;
try {
c1=Class.forName("Person");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
Person p1=(Person)c1.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
要在像主函数那样调用,那么类必须有是无参构造,否则就要调用指定的构造方法,并向其传递指定的参数才可以进行实例化操作。
如果要想得到一个类的构造方法,则可以使用以下的方法:
public Constructor<?>[] getConstructors()
这个方法得到全部的构造方法,因为一个类中存在多个构造方法,所有会以Constructor对象数组的形式返回,Constructor类的定义在java.lang.reflect包中,所以属性反射的操作包。
取得一个构造方法之后,可以通过Constructor类以下的方法进行实例化:
public T newInstance(Object...initargs)
import java.lang.reflect.Constructor;
class Person
{
private String name;
private int age;
Person(String name,int age)
{
this.name=name;
this.age=age;
}
public String getString()
{
return "hello world";
}
}
public class PersonClassDemo {
public static void main(String args[]) throws Exception
{
Class<?> c1=null;
Person per=null;
c1=Class.forName("Person");
//得到构造方法数组
Constructor cons[]=c1.getConstructors();
//参数最多的作为第一个构造
per=(Person)cons[0].newInstance("jin",22);
System.out.println(per);
}
}