A.获得类信息
1、使用类 【类.class】
2、使用对象 【对象.getClass】
3、使用名称 【Class.forName("类的全名称")】
B.获得封装信息
1、字段
getFields
getDeclaredFields
2、方法
getMethods
getDeclaredMethods
3、构造方法
getConstructors
getDeclaredConstructors
C.创建对象
1、传统方法
Account account = new Account(1, "lingling");
2、反射创建对象(无参数构造方法)
Class clz = Class.forName("com.learn.Account");
account = (Account) clz.newInstance();
3、反射创建对象(有参数构造方法)
Constructor constructor = clz.getConstructor(int.class, String.class);
account = (Account) constructor.newInstance(999, "我是他哥");
D.操作数据
Account account1 = new Account(1, "lingling");
Account account2 = new Account(2, "lingli");
Class clz = Class.forName("com.learn.Account");
Field field = clz.getField("name");
// 获得数据
String name = (String) field.get(account1);
System.out.println(name);
// 修改数据
field.set(account1, "你好");
System.out.println(account1.getName());
// 私有的字段
Field idField = clz.getDeclaredField("id");
idField.setAccessible(true);
System.out.println(idField.getInt(account1));
E.操作方法
method.invoke(object)
例子:
Account account = new Account(2, "lingli");
System.out.println(account);
Class clz = Class.forName("com.learn.Account");
Method setName = clz.getMethod("setName", String.class);
// 传统方式
account.setName("玩一会");
// 反射方式
Object result = setName.invoke(account, "玩一会");
System.out.println(account);
// 私有方法
Method myLove = clz.getDeclaredMethod("myLove");
myLove.setAccessible(true);
myLove.invoke(account);
F.超级工厂方法
public class Factory {
public static IAccountDAO getAccountDAO() {
// return new OracleAccountDAO();
// return new SqlAccountDAO();
// return new MySqlAccountDAO();
try {
Properties properties = new Properties();
properties.load(Factory.class.getResourceAsStream("config.txt"));
String accountDAO = properties.getProperty("AccountDAO");
Class clz = Class.forName(accountDAO);
return (IAccountDAO) clz.newInstance();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}