Java反射机制和创建实例

图片说明
小弟在培训班学的Java进度比较快有很多没听懂的,问同学也都是菜鸡儿互啄,现在稍微搞清楚了点反射和暴力反射.然后又突然想起个直接创建实例的话,因为Student类中全部被用私有修饰符修饰了,所以直接Student s=new Student( );的话,是会报错了,此刻还能用这种方式去怎么打破获取一下方法么?还是说此时只能用反射去进行方法和属性的调用啊?问题问的可能比较抽象,专业术语小弟我说不出来呀啊哈哈,还请谅解.

构造函数是 new 对象的关键,你这里构造函数定义为 private 说明只能在这个类自己才能调用,一般再单例模式中才将类定义为私有构造函数。
如果想在其他类中new 这个 Student 对象,必须是 public 或者 package 包修饰构造函数才行。

如果你对对象的构造方法进行私有化以后,以后仍然想获取该对象的实例,你可以另写一个方法来返回这个实例,
这种获取实例的方法,比较符合单例模式的写法。

当一个对象的的构造方法设置为private,只能被该对象的内部使用,外部是无法使用的,所以你在外面new是会报错的。
一般私有化构造函数一般是用在单例模式上的。


public class Student {

    public static Student student;

    private Student() {
    }

    //这样就可以保证整个程序最多只能有一个student对象
    public static Student getInstance() {
    //如果student为null,就创建student对象,否则不创建,直接在下面返回已经存在的student
        if(student == null) {  
            student = new Student();
        }
        return student;
    }
}

package aaa;

public class AAA {

private String name;

private  AAA() {

}

public String getName() {
    return name;
}

private void setName(String name) {
    this.name = name;
}

}
////////////////////
package aaa;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

import aaa.aaa.AAAService;

public class BBB {
public static void main(String[] args) throws Exception {
Class aaa=Class.forName("aaa.AAA");
Method m=aaa.getDeclaredMethod("setName", String.class);
m.setAccessible(true);
Constructor a= aaa.getDeclaredConstructor();
a.setAccessible(true);
AAA b=a.newInstance();
m.invoke(b, "我是小名");
System.out.println(b.getName());
}
}
////////////
运行结果:我是小名
////////////////
只有私有 的构造方法,要么在本类中获取实例,然后提供一个公有的方法给外部调用来获取实例。
要么就像我这样通过反射,在jvm运行时获取实例,反射的一个特点就是可以突破私有制。我在该实验中获取了私有的构造方法和私有的普通方法。