BAEL-13505 Move articles out of core java - part 2
This commit is contained in:
@@ -1,32 +0,0 @@
|
||||
package com.baeldung.classloader;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
|
||||
public class CustomClassLoader extends ClassLoader {
|
||||
|
||||
@Override
|
||||
public Class findClass(String name) throws ClassNotFoundException {
|
||||
byte[] b = loadClassFromFile(name);
|
||||
return defineClass(name, b, 0, b.length);
|
||||
}
|
||||
|
||||
private byte[] loadClassFromFile(String fileName) {
|
||||
InputStream inputStream = getClass().getClassLoader().getResourceAsStream(
|
||||
fileName.replace('.', File.separatorChar) + ".class");
|
||||
byte[] buffer;
|
||||
ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
|
||||
int nextValue = 0;
|
||||
try {
|
||||
while ( (nextValue = inputStream.read()) != -1 ) {
|
||||
byteStream.write(nextValue);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
buffer = byteStream.toByteArray();
|
||||
return buffer;
|
||||
}
|
||||
}
|
||||
@@ -1,22 +0,0 @@
|
||||
package com.baeldung.classloader;
|
||||
|
||||
import com.sun.javafx.util.Logging;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URL;
|
||||
import java.net.URLConnection;
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class PrintClassLoader {
|
||||
|
||||
public void printClassLoaders() throws ClassNotFoundException {
|
||||
|
||||
System.out.println("Classloader of this class:" + PrintClassLoader.class.getClassLoader());
|
||||
System.out.println("Classloader of Logging:" + Logging.class.getClassLoader());
|
||||
System.out.println("Classloader of ArrayList:" + ArrayList.class.getClassLoader());
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,70 +0,0 @@
|
||||
package com.baeldung.instrumentation.agent;
|
||||
|
||||
import javassist.CannotCompileException;
|
||||
import javassist.ClassPool;
|
||||
import javassist.CtClass;
|
||||
import javassist.CtMethod;
|
||||
import javassist.NotFoundException;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.lang.instrument.ClassFileTransformer;
|
||||
import java.lang.instrument.IllegalClassFormatException;
|
||||
import java.security.ProtectionDomain;
|
||||
|
||||
public class AtmTransformer implements ClassFileTransformer {
|
||||
|
||||
private static Logger LOGGER = LoggerFactory.getLogger(AtmTransformer.class);
|
||||
|
||||
private static final String WITHDRAW_MONEY_METHOD = "withdrawMoney";
|
||||
|
||||
/** The internal form class name of the class to transform */
|
||||
private String targetClassName;
|
||||
/** The class loader of the class we want to transform */
|
||||
private ClassLoader targetClassLoader;
|
||||
|
||||
public AtmTransformer(String targetClassName, ClassLoader targetClassLoader) {
|
||||
this.targetClassName = targetClassName;
|
||||
this.targetClassLoader = targetClassLoader;
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined,
|
||||
ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
|
||||
byte[] byteCode = classfileBuffer;
|
||||
|
||||
String finalTargetClassName = this.targetClassName.replaceAll("\\.", "/"); //replace . with /
|
||||
if (!className.equals(finalTargetClassName)) {
|
||||
return byteCode;
|
||||
}
|
||||
|
||||
if (className.equals(finalTargetClassName) && loader.equals(targetClassLoader)) {
|
||||
LOGGER.info("[Agent] Transforming class MyAtm");
|
||||
try {
|
||||
ClassPool cp = ClassPool.getDefault();
|
||||
CtClass cc = cp.get(targetClassName);
|
||||
CtMethod m = cc.getDeclaredMethod(WITHDRAW_MONEY_METHOD);
|
||||
m.addLocalVariable("startTime", CtClass.longType);
|
||||
m.insertBefore("startTime = System.currentTimeMillis();");
|
||||
|
||||
StringBuilder endBlock = new StringBuilder();
|
||||
|
||||
m.addLocalVariable("endTime", CtClass.longType);
|
||||
m.addLocalVariable("opTime", CtClass.longType);
|
||||
endBlock.append("endTime = System.currentTimeMillis();");
|
||||
endBlock.append("opTime = (endTime-startTime)/1000;");
|
||||
|
||||
endBlock.append("LOGGER.info(\"[Application] Withdrawal operation completed in:\" + opTime + \" seconds!\");");
|
||||
|
||||
m.insertAfter(endBlock.toString());
|
||||
|
||||
byteCode = cc.toBytecode();
|
||||
cc.detach();
|
||||
} catch (NotFoundException | CannotCompileException | IOException e) {
|
||||
LOGGER.error("Exception", e);
|
||||
}
|
||||
}
|
||||
return byteCode;
|
||||
}
|
||||
}
|
||||
@@ -1,59 +0,0 @@
|
||||
package com.baeldung.instrumentation.agent;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.lang.instrument.Instrumentation;
|
||||
|
||||
public class MyInstrumentationAgent {
|
||||
private static Logger LOGGER = LoggerFactory.getLogger(MyInstrumentationAgent.class);
|
||||
|
||||
public static void premain(String agentArgs, Instrumentation inst) {
|
||||
LOGGER.info("[Agent] In premain method");
|
||||
|
||||
String className = "com.baeldung.instrumentation.application.MyAtm";
|
||||
transformClass(className,inst);
|
||||
}
|
||||
|
||||
public static void agentmain(String agentArgs, Instrumentation inst) {
|
||||
LOGGER.info("[Agent] In agentmain method");
|
||||
|
||||
String className = "com.baeldung.instrumentation.application.MyAtm";
|
||||
transformClass(className,inst);
|
||||
}
|
||||
|
||||
private static void transformClass(String className, Instrumentation instrumentation) {
|
||||
Class<?> targetCls = null;
|
||||
ClassLoader targetClassLoader = null;
|
||||
// see if we can get the class using forName
|
||||
try {
|
||||
targetCls = Class.forName(className);
|
||||
targetClassLoader = targetCls.getClassLoader();
|
||||
transform(targetCls, targetClassLoader, instrumentation);
|
||||
return;
|
||||
} catch (Exception ex) {
|
||||
LOGGER.error("Class [{}] not found with Class.forName");
|
||||
}
|
||||
// otherwise iterate all loaded classes and find what we want
|
||||
for(Class<?> clazz: instrumentation.getAllLoadedClasses()) {
|
||||
if(clazz.getName().equals(className)) {
|
||||
targetCls = clazz;
|
||||
targetClassLoader = targetCls.getClassLoader();
|
||||
transform(targetCls, targetClassLoader, instrumentation);
|
||||
return;
|
||||
}
|
||||
}
|
||||
throw new RuntimeException("Failed to find class [" + className + "]");
|
||||
}
|
||||
|
||||
private static void transform(Class<?> clazz, ClassLoader classLoader, Instrumentation instrumentation) {
|
||||
AtmTransformer dt = new AtmTransformer(clazz.getName(), classLoader);
|
||||
instrumentation.addTransformer(dt, true);
|
||||
try {
|
||||
instrumentation.retransformClasses(clazz);
|
||||
} catch (Exception ex) {
|
||||
throw new RuntimeException("Transform failed for class: [" + clazz.getName() + "]", ex);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,46 +0,0 @@
|
||||
package com.baeldung.instrumentation.application;
|
||||
|
||||
import com.sun.tools.attach.VirtualMachine;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.Optional;
|
||||
|
||||
/**
|
||||
* Created by adi on 6/10/18.
|
||||
*/
|
||||
public class AgentLoader {
|
||||
private static Logger LOGGER = LoggerFactory.getLogger(AgentLoader.class);
|
||||
|
||||
public static void run(String[] args) {
|
||||
String agentFilePath = "/home/adi/Desktop/agent-1.0.0-jar-with-dependencies.jar";
|
||||
String applicationName = "MyAtmApplication";
|
||||
|
||||
//iterate all jvms and get the first one that matches our application name
|
||||
Optional<String> jvmProcessOpt = Optional.ofNullable(VirtualMachine.list()
|
||||
.stream()
|
||||
.filter(jvm -> {
|
||||
LOGGER.info("jvm:{}", jvm.displayName());
|
||||
return jvm.displayName().contains(applicationName);
|
||||
})
|
||||
.findFirst().get().id());
|
||||
|
||||
if(!jvmProcessOpt.isPresent()) {
|
||||
LOGGER.error("Target Application not found");
|
||||
return;
|
||||
}
|
||||
File agentFile = new File(agentFilePath);
|
||||
try {
|
||||
String jvmPid = jvmProcessOpt.get();
|
||||
LOGGER.info("Attaching to target JVM with PID: " + jvmPid);
|
||||
VirtualMachine jvm = VirtualMachine.attach(jvmPid);
|
||||
jvm.loadAgent(agentFile.getAbsolutePath());
|
||||
jvm.detach();
|
||||
LOGGER.info("Attached to target JVM and loaded Java agent successfully");
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,14 +0,0 @@
|
||||
package com.baeldung.instrumentation.application;
|
||||
|
||||
/**
|
||||
* Created by adi on 6/14/18.
|
||||
*/
|
||||
public class Launcher {
|
||||
public static void main(String[] args) throws Exception {
|
||||
if(args[0].equals("StartMyAtmApplication")) {
|
||||
new MyAtmApplication().run(args);
|
||||
} else if(args[0].equals("LoadAgent")) {
|
||||
new AgentLoader().run(args);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,19 +0,0 @@
|
||||
package com.baeldung.instrumentation.application;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
/**
|
||||
* Created by adi on 6/11/18.
|
||||
*/
|
||||
public class MyAtm {
|
||||
private static Logger LOGGER = LoggerFactory.getLogger(MyAtm.class);
|
||||
|
||||
private static final int account = 10;
|
||||
|
||||
public static void withdrawMoney(int amount) throws InterruptedException {
|
||||
Thread.sleep(2000l); //processing going on here
|
||||
LOGGER.info("[Application] Successful Withdrawal of [{}] units!", amount);
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,19 +0,0 @@
|
||||
package com.baeldung.instrumentation.application;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
public class MyAtmApplication {
|
||||
|
||||
private static Logger LOGGER = LoggerFactory.getLogger(MyAtmApplication.class);
|
||||
|
||||
public static void run(String[] args) throws Exception {
|
||||
LOGGER.info("[Application] Starting ATM application");
|
||||
MyAtm.withdrawMoney(Integer.parseInt(args[2]));
|
||||
|
||||
Thread.sleep(Long.valueOf(args[1]));
|
||||
|
||||
MyAtm.withdrawMoney(Integer.parseInt(args[3]));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,28 +0,0 @@
|
||||
package com.baeldung.logforging;
|
||||
|
||||
import org.owasp.esapi.ESAPI;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
public class LogForgingDemo {
|
||||
|
||||
private final Logger logger = LoggerFactory.getLogger(LogForgingDemo.class);
|
||||
|
||||
public void addLog(String amount) {
|
||||
logger.info("Amount credited = {}", amount);
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
LogForgingDemo demo = new LogForgingDemo();
|
||||
demo.addLog("300");
|
||||
demo.addLog("300 \n\nweb - 2017-04-12 17:47:08,957 [main] INFO Amount reversed successfully");
|
||||
demo.addLog(encode("300 \n\nweb - 2017-04-12 17:47:08,957 [main] INFO Amount reversed successfully"));
|
||||
}
|
||||
|
||||
public static String encode(String message) {
|
||||
message = message.replace('\n', '_').replace('\r', '_').replace('\t', '_');
|
||||
message = ESAPI.encoder().encodeForHTML(message);
|
||||
return message;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,2 +0,0 @@
|
||||
### Relevant Articles:
|
||||
- [How to Print Screen in Java](http://www.baeldung.com/print-screen-in-java)
|
||||
@@ -1,23 +0,0 @@
|
||||
package com.baeldung.printscreen;
|
||||
|
||||
import javax.imageio.ImageIO;
|
||||
import java.awt.*;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.File;
|
||||
|
||||
public class Screenshot {
|
||||
|
||||
private final String path;
|
||||
|
||||
public Screenshot(String path) {
|
||||
this.path = path;
|
||||
}
|
||||
|
||||
public void getScreenshot(int timeToWait) throws Exception {
|
||||
Rectangle rectangle = new Rectangle(Toolkit.getDefaultToolkit()
|
||||
.getScreenSize());
|
||||
Robot robot = new Robot();
|
||||
BufferedImage img = robot.createScreenCapture(rectangle);
|
||||
ImageIO.write(img, "jpg", new File(path));
|
||||
}
|
||||
}
|
||||
@@ -1,18 +0,0 @@
|
||||
package com.baeldung.system;
|
||||
|
||||
import org.apache.commons.lang3.SystemUtils;
|
||||
|
||||
public class DetectOS {
|
||||
|
||||
public String getOperatingSystem() {
|
||||
String os = System.getProperty("os.name");
|
||||
System.out.println("Using System Property: " + os);
|
||||
return os;
|
||||
}
|
||||
|
||||
public String getOperatingSystemSystemUtils() {
|
||||
String os = SystemUtils.OS_NAME;
|
||||
System.out.println("Using SystemUtils: " + os);
|
||||
return os;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user