javac foo/bar/Main.java
java foo.bar.Main
反射技术可以操作私有属性,私有方法
Class cls = Monkey.class;
Monkey monkey = new Monkey();
Class cls = monkey.getClass();
Class cls = Class.forName("foo.bar.Monkey");
import java.lang.reflect.Field;
public class Main {
public static void main(String[] args) {
try {
Monkey monkey = new Monkey();
Class> cls = Monkey.class;
Field field = cls.getDeclaredField("sex");
field.setAccessible(true);
field.set(monkey, "女");
String sex = (String)field.get(monkey);
System.out.println(sex);
} catch(Exception e) {
e.printStackTrace();
}
}
}
import java.lang.reflect.Method;
public class Main {
public static void main(String[] args) {
try {
Monkey monkey = new Monkey();
Class> cls = Monkey.class;
Method setMethod = cls.getDeclaredMethod("setSex", String.class);
setMethod.setAccessible(true);
Method getMethod = cls.getDeclaredMethod("getSex");
getMethod.setAccessible(true);
setMethod.invoke(monkey, "男");
String sex = (String)getMethod.invoke(monkey);
System.out.println(sex);
} catch(Exception e) {
e.printStackTrace();
}
}
}
当应用程序只需要构造类的一个实例
/**
* 等程序需要时再初始化实例,可节省资源
*/
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
/**
* 确保线程安全
*/
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
使用一个单独的工厂类来创建不同的对象
public class PizzaFactory {
public Pizza createPizza(String type) {
Pizza pizza = null;
if(type.equals("cheeze")) {
pizza = new CheezePizza();
}
return pizza;
}
}
class PizzaStore {
public Pizza orderPizza() {
Pizza pizza;
pizza = factory.createPizza("cheeze");
pizza.prepare();
pizza.bake();
return pizza;
}
}
工厂方法将对象的创建延迟到子类
public abstract class PizzaStore {
public Pizza orderPizza(String type) {
Pizza pizza;
pizza = createPizza(type);
pizza.prepare();
pizza.bake();
}
public abstract Pizza createPizza(String type);
}
抽象工厂模式提供一个创建一系列相关或互相依赖对象的接口,而无需指定它们具体的类
public abstract class Store {
public abstract Pizza createPizza(String type);
public abstract Coke createCoke(String type);
}
21
21
mvn clean # 清理项目,删除target文件夹,不会删除本地仓库
mvn compile # 把.java编译成.class,并输出在target文件夹中
mvn test # 运行测试代码
mvn package # 把项目打包成jar,输出在target文件夹中
mvn install # 把项目安装在本地仓库中(.m2文件夹)
mvn deploy # 推送到远程仓库
mvn archetype:generate # 通过模板创建新项目
mvn dependency:tree # 查看依赖
mvn clean clover:setup test clover:aggregate clover:clover # clover生成test覆盖率报告
# mvn :
# pitest生成代码突变报告和覆盖率报告
mvn clean test-compile org.pitest:pitest-maven:mutationCoverage
# 自动生成测试代码 <项目根目录>/.evosuite
mvn -DmemoryInMB=2500 -Dcores=5 evosuite:generate
groupId是开发人员
artifactId是项目名字
版本号后的SNAPSHOT意思是处于开发阶段
Eclipse 是一个 Java 应用程序,依赖于 JVM 来执行。
Eclipse默认使用的是jre的运行环境,所以找不到jdk的包,解决方法,编辑Eclipse安装目录下面的eclipse.ini,在”-vmargs”前添加下面代码,保存、重启eclipse后Update Project即可。
-vm
\jre\bin\server\jvm.dll
-vm
是 Eclipse 配置文件 eclipse.ini
中的一个选项,它指定了 Eclipse 使用的 Java 虚拟机
mvn # 与上述图等价
# 自定义线程池 (常驻线程, 最大线程, 线程过期时间, 时间单位, 存储队列)
ExecutorService pool = new ThreadPoolExecutor(3, 10, 1, TimeUnit.SECONDS, queue);
ExecutorService fixedPool = Executors.newFixedThreadPool(5);
# 大小无限制
ExecutorService cachedPool = Executors.newCachedThreadPool();
ExecutorService singleThreadPool = Executors.newSingleThreadExecutor();
pool.submit(Runnable); # 有返回值 不阻塞
pool.execute(Runnable); # 无返回值 不阻塞
pool.shutdown(); # 原有任务会继续执行
Future future = pool.submit(Callable);
future.get(); # 会阻塞