获取class文件对象的三种方式
* 获取class文件对象的方式:
* A:Object类的getClass()方法
* B:数据类型的静态属性class
* C:Class类中的静态方法
* public static Class forName(String className);
*
* 3选1,如何选择?
* 开发用第3种。
* 因为第3种是一个字符串,而不是一个具体的类名,这样就可以把字符串配置到配置文件中
/*
* 获取class文件对象的方式:
* A:Object类的getClass()方法
* B:数据类型的静态属性class
* C:Class类中的静态方法
* public static Class forName(String className);
*
* 3选1,如何选择?
* 开发用第3种。
* 因为第3种是一个字符串,而不是一个具体的类名,这样就可以把字符串配置到配置文件中
* */
public class ClientDemo {
public static void main(String[] args) throws ClassNotFoundException {
// 方法1
Person p = new Person();
Class c = p.getClass();
Person p2 = new Person();
Class c2 = p2.getClass();
System.out.println(p == p2);// false
System.out.println(c == c2);// true
// 方法2
Class c3 = Person.class;
System.out.println(c == c3);// true
// 方法3
Class c4 = Class.forName("com.jacky.Person");// 必须带包名,右键Person,Copy Qualified Name
System.out.println(c == c4);// true
}
}
class Person {
private String name;
int age;
public String address;
public Person() {
}
public Person(String name, int age, String address) {
this.name = name;
this.age = age;
this.address = address;
}
}
* public Constructor<T> getConstructor(Class<?>... parameterTypes)
* throws NoSuchMethodException,
* SecurityException
* 返回一个Constructor对象,它反映此Class对象所表示的类的指定公共构造方法。
*
* public Constructor<?>[] getConstructors
* throws SecurityException
* 返回一个包含某些Constructor对象的数组,这些对象反映此Class对象所表示的类的所有公共构造方法。
*
* public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
throws NoSuchMethodException,
SecurityException
* 返回一个Constructor对象,它反映此Class对象所表示的类的指定构造方法。
*
* public Constructor<?>[] getDeclaredConstructors
* throws SecurityException
* 返回Constructor对象的一个数组,这些对象反映此Class对象表示的类声明的所有构造方法。
*
* public Field getDeclaredField(String name)
throws NoSuchFieldException,
SecurityException
获取单个成员
*
* public Field[] getDeclaredFields()
throws SecurityException
获取所有成员
*
* public Field[] getFields()
throws SecurityException
获取所有公共成员
*
* public T newInstance(Object... initargs)
* throws InstantiationException,
* IllegalAccessException,
* IllegalArgumentException,
* InvocationTargetException
* 使用此Constructor对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。
*
* public void set(Object obj,
Object value)
throws IllegalArgumentException,
IllegalAccessException
将指定对象变量上此Field对象表示的字段设置为指定的新值。
import java.lang.reflect.Constructor;
/*
* public Constructor<T> getConstructor(Class<?>... parameterTypes)
* throws NoSuchMethodException,
* SecurityException
* 返回一个Constructor对象,它反映此Class对象所表示的类的指定公共构造方法。
*
* public Constructor<?>[] getConstructors
* throws SecurityException
* 返回一个包含某些Constructor对象的数组,这些对象反映此Class对象所表示的类的所有公共构造方法。
*
* public Constructor<?>[] getDeclaredConstructors
* throws SecurityException
* 返回Constructor对象的一个数组,这些对象反映此Class对象表示的类声明的所有构造方法。
*
* public T newInstance(Object... initargs)
* throws InstantiationException,
* IllegalAccessException,
* IllegalArgumentException,
* InvocationTargetException
* 使用此Constructor对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。
* */
public class ClientDemo {
public static void main(String[] args) throws Exception {
Class c = Class.forName("com.jacky.Person");
Constructor constructor = c.getConstructor();
Object obj = constructor.newInstance();
System.out.println(obj);
Person p = (Person) obj;
p.show();
System.out.println("----------------");
Constructor cons1[] = c.getConstructors();
for (Constructor con : cons1) {
System.out.println(con);
}
System.out.println("----------------");
Constructor cons2[] = c.getDeclaredConstructors();
for (Constructor con : cons2) {
System.out.println(con);
}
}
}
class Person {
private String name;
int age;
public String address;
public Person() {
}
public Person(String name, int age, String address) {
this.name = name;
this.age = age;
this.address = address;
}
protected Person(int age) {
this.age = age;
}
private Person(String name) {
this.name = name;
}
Person(String name, int age) {// 没有public
this.name = name;
this.age = age;
}
public void show() {
System.out.println("show");
}
}
* public Constructor<T> getConstructor(Class<?>... parameterTypes)
* throws NoSuchMethodException,
* SecurityException
* 返回一个Constructor对象,它反映此Class对象所表示的类的指定公共构造方法。
*
* 通过反射获取带参构造方法并使用
import java.lang.reflect.Constructor;
/*
* public Constructor<T> getConstructor(Class<?>... parameterTypes)
* throws NoSuchMethodException,
* SecurityException
* 返回一个Constructor对象,它反映此Class对象所表示的类的指定公共构造方法。
*
* 通过反射获取带参构造方法并使用
* */
public class ClientDemo {
public static void main(String[] args) throws Exception {
Class c = Class.forName("com.jacky.Person");
Constructor constructor = c.getConstructor(String.class, int.class, String.class);
Object obj = constructor.newInstance("呵呵", 22, "哈哈");
System.out.println(obj);
}
}
class Person {
private String name;
int age;
public String address;
public Person() {
}
public Person(String name, int age, String address) {
this.name = name;
this.age = age;
this.address = address;
}
protected Person(int age) {
this.age = age;
}
private Person(String name) {
this.name = name;
}
Person(String name, int age) {// 没有public
this.name = name;
this.age = age;
}
public void show() {
System.out.println("show");
}
}
* public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
throws NoSuchMethodException,
SecurityException
* 返回一个Constructor对象,它反映此Class对象所表示的类的指定构造方法。
通过反射获取私有构造方法并使用
import java.lang.reflect.Constructor;
/*
* public Constructor<T> getConstructor(Class<?>... parameterTypes)
* throws NoSuchMethodException,
* SecurityException
* 返回一个Constructor对象,它反映此Class对象所表示的类的指定公共构造方法。
*
* public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
throws NoSuchMethodException,
SecurityException
* 返回一个Constructor对象,它反映此Class对象所表示的类的指定构造方法。
*
* public Constructor<?>[] getConstructors
* throws SecurityException
* 返回一个包含某些Constructor对象的数组,这些对象反映此Class对象所表示的类的所有公共构造方法。
*
* public Constructor<?>[] getDeclaredConstructors
* throws SecurityException
* 返回Constructor对象的一个数组,这些对象反映此Class对象表示的类声明的所有构造方法。
*
* public T newInstance(Object... initargs)
* throws InstantiationException,
* IllegalAccessException,
* IllegalArgumentException,
* InvocationTargetException
* 使用此Constructor对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。
* */
public class ClientDemo {
public static void main(String[] args) throws Exception {
Class c = Class.forName("com.jacky.Person");
Constructor constructor = c.getDeclaredConstructor(String.class, int.class, String.class);
Object obj = constructor.newInstance("呵呵", 22, "哈哈");
System.out.println(obj);
}
}
class Person {
private String name;
int age;
public String address;
public Person() {
}
public Person(String name, int age, String address) {
this.name = name;
this.age = age;
this.address = address;
}
protected Person(int age) {
this.age = age;
}
private Person(String name) {
this.name = name;
}
Person(String name, int age) {// 没有public
this.name = name;
this.age = age;
}
public void show() {
System.out.println("show");
}
}
* public Field[] getDeclaredFields()
throws SecurityException
获取所有成员
*
* public Field[] getFields()
throws SecurityException
获取所有公共成员
import java.lang.reflect.Field;
/*
* public Constructor<T> getConstructor(Class<?>... parameterTypes)
* throws NoSuchMethodException,
* SecurityException
* 返回一个Constructor对象,它反映此Class对象所表示的类的指定公共构造方法。
*
* public Constructor<?>[] getConstructors
* throws SecurityException
* 返回一个包含某些Constructor对象的数组,这些对象反映此Class对象所表示的类的所有公共构造方法。
*
* public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
throws NoSuchMethodException,
SecurityException
* 返回一个Constructor对象,它反映此Class对象所表示的类的指定构造方法。
*
* public Constructor<?>[] getDeclaredConstructors
* throws SecurityException
* 返回Constructor对象的一个数组,这些对象反映此Class对象表示的类声明的所有构造方法。
*
* public Field getDeclaredField(String name)
throws NoSuchFieldException,
SecurityException
获取单个成员
*
* public Field[] getDeclaredFields()
throws SecurityException
获取所有成员
*
* public Field[] getFields()
throws SecurityException
获取所有公共成员
*
* public T newInstance(Object... initargs)
* throws InstantiationException,
* IllegalAccessException,
* IllegalArgumentException,
* InvocationTargetException
* 使用此Constructor对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。
*
* public void set(Object obj,
Object value)
throws IllegalArgumentException,
IllegalAccessException
将指定对象变量上此Field对象表示的字段设置为指定的新值。
* */
public class ClientDemo {
public static void main(String[] args) throws Exception {
Class c = Class.forName("com.jacky.Person");
Field fields1[]=c.getFields();
for(Field field:fields1)
{
System.out.println(field);
}
System.out.println("----------------");
Field fields2[]=c.getDeclaredFields();
for(Field field:fields2)
{
System.out.println(field);
}
}
}
class Person {
private String name;
int age;
public String address;
public Person() {
}
public Person(String name, int age, String address) {
this.name = name;
this.age = age;
this.address = address;
}
protected Person(int age) {
this.age = age;
}
private Person(String name) {
this.name = name;
}
Person(String name, int age) {// 没有public
this.name = name;
this.age = age;
}
public void show() {
System.out.println("show");
}
}
通过反射越过泛型检查
如何在这个集合ArrayList<Integer>添加一个字符串常量?
import java.lang.reflect.Method;
import java.util.ArrayList;
/*
* 如何在这个集合ArrayList<Integer>添加一个字符串常量?
* */
public class Test {
public static void main(String[] args) throws Exception {
ArrayList<Integer> array = new ArrayList<Integer>();
Class c = array.getClass();
Method m = c.getMethod("add", Object.class);
m.invoke(array, "hello");
m.invoke(array, "world");
m.invoke(array, "java");
System.out.println(array);
}
}