1.使用new关键字
这是最常见也是最简单的创建对象的方式了。通过这种方式,我们可以调用任意的构造函数(无参的和带参数的)。
2.使用Class类的newInstance方法
我们也可以使用Class类的newInstance方法创建对象。这个newInstance方法调用无参的构造函数创建对象。
3.使用Constructor类的newInstance方法
和Class类的newInstance方法很像,
java.lang.reflect.Constructor类里也有一个newInstance方法可以创建对象。
4.使用clone方法
无论何时我们调用一个对象的clone方法,jvm就会创建一个新的对象,将前面对象的内容全部拷贝进去。用clone方法创建对象并不会调用任何构造函数。
5.使用反序列化
当我们序列化和反序列化一个对象,jvm会给我们创建一个单独的对象。在反序列化时,jvm创建对象并不会调用任何构造函数。
为了反序列化一个对象,我们需要让我们的类实现Serializable接口
java反射得到一个类的私有方法
1.通过class.forname()获取类
2.获取目标对象 Method method=clazz.getDeclaredMethod(name);//可以调用类中的所有方法(不包括父类中继承的方法) Method
method=clazz.getMethod(name);//可以调用类中有访问权限的方法(包括父类中继承的方法)
3.method.toGenericString()或method.toString()方法来输出方法的字符串形式
4.使用invoke()方法调用方法
类的加载过程
Class<?> c1 = Class.forName("com.zyf.dao.User");
Field[] fields = c1.getFields();//获取public 修饰的属性
for (int i = 0; i < fields.length; i++) {
System.out.println(fields[i]);
}
System.out.println("11111111111111");
fields = c1.getDeclaredFields();//获取所有属性
for (int i = 0; i < fields.length; i++) {
System.out.println(fields[i]);
}
Method[] methods = c1.getMethods();//获取所有本类+父类的publc公开的方法
for (int i = 0; i < methods.length; i++) {
System.out.println(methods[i]);
}
System.out.println("=============");
methods = c1.getDeclaredMethods();//获取本类中的所有方法
for (int i = 0; i < methods.length; i++) {
System.out.println(methods[i]);
}
//1.通过 Class.forName() 获取类
Class c1 = Class.forName("com.zyf.dao.User");
//2.通过newInstance()方法 获取具体的对象
Object user = c1.newInstance();
System.out.println(user);
//3.通过getDeclaredMethod 得到具体的方法
Method getName = c1.getDeclaredMethod("getName");
Method setName = c1.getDeclaredMethod("setName", String.class);
//4.通过invoke进行赋值和获取信息
setName.invoke(user,"zhangsan");
Object invoke = getName.invoke(user);
System.out.println(invoke);
System.out.println(user);
//5.通过getDeclaredConstructor(参数类型) 得到构造方法
Constructor<?> constructor = c1.getDeclaredConstructor(String.class, String.class);
//6.通过newInstance 得到对象 可以无参
Object s = constructor.newInstance("张飞", "11234");
//invoke(对象名,方法的参数值)
setName.invoke(s,"张云飞");
System.out.println(s);
//7.getDeclaredField获取属性
Field name = c1.getDeclaredField("name");//name属性是私有的 获取不到
//不能直接操作私有的属性,我们要关闭程序的安全监测,属性或者方法的setAccessible(true)
name.setAccessible(true);
name.set(s,"ppt");
System.out.println(s);
//8.getDeclaredMethod获取方法
Method setlalala = c1.getDeclaredMethod("setlalala", String.class);
//不能直接操作私有的属性,我们要关闭程序的安全监测,属性或者方法的setAccessible(true)
setlalala.setAccessible(true);
setlalala.invoke(s,"woshishui");
System.out.println(s);
Field[] fields = c1.getFields();//获取public 修饰的属性
// for (int i = 0; i < fields.length; i++) {
// System.out.println(fields[i]);
// }
// System.out.println("11111111111111");
// fields = c1.getDeclaredFields();//获取所有属性
// for (int i = 0; i < fields.length; i++) {
// System.out.println(fields[i]);
// }
//
// Method[] methods = c1.getMethods();//获取所有本类+父类的publc公开的方法
// for (int i = 0; i < methods.length; i++) {
// System.out.println(methods[i]);
// }
// System.out.println("=============");
// methods = c1.getDeclaredMethods();//获取本类中的所有方法
// for (int i = 0; i < methods.length; i++) {
// System.out.println(methods[i]);
// }
关闭监测能提高执行效率