class A {
private int a = 0;
class B {
private int a = 10;
public void print(){
System.out.println(a);
System.out.println(this.a);
}
}
public void print(){
new B().print();
}
}
new A().print();
Art. 124. § 1. Kto cudzą rzecz umyślnie niszczy, uszkadza lub czyni niezdatną do użytku, jeżeli szkoda nie przekracza 250 złotych,podlega karze aresztu, ograniczenia wolności albo grzywny.
§ 2. Usiłowanie, podżeganie i pomocnictwo są karalne.
§ 3. Ściganie następuje na żądanie pokrzywdzonego.
§ 4. W razie popełnienia wykroczenia można orzec obowiązek zapłaty równowartości wyrządzonej szkody lub obowiązek przywrócenia do stanu poprzedniego.
Art. 267. § 1. Kto bez uprawnienia uzyskuje dostęp do informacji dla niego nieprzeznaczonej, otwierając zamknięte pismo, podłączając się do sieci telekomunikacyjnej lub przełamując albo omijając elektroniczne, magnetyczne, informatyczne lub inne szczególne jej zabezpieczenie, podlega grzywnie, karze ograniczenia wolności albo pozbawienia wolności do lat 2.
§ 2. Tej samej karze podlega, kto bez uprawnienia uzyskuje dostęp do całości lub części systemu informatycznego.
§ 3. Tej samej karze podlega, kto w celu uzyskania informacji, do której nie jest uprawniony, zakłada lub posługuje się urządzeniem podsłuchowym, wizualnym albo innym urządzeniem lub oprogramowaniem.
§ 4. Tej samej karze podlega, kto informację uzyskaną w sposób określony w § 1-3 ujawnia innej osobie.
§ 5. Ściganie przestępstwa określonego w § 1-4 następuje na wniosek pokrzywdzonego.
Art. 268. § 1. Kto, nie będąc do tego uprawnionym, niszczy, uszkadza, usuwa lub zmienia zapis istotnej informacji albo w inny sposób udaremnia lub znacznie utrudnia osobie uprawnionej zapoznanie się z nią, podlega grzywnie, karze ograniczenia wolności albo pozbawienia wolności do lat 2.
§ 2. Jeżeli czyn określony w § 1 dotyczy zapisu na informatycznym nośniku danych, sprawca podlega karze pozbawienia wolności do lat 3.
§ 3. Kto, dopuszczając się czynu określonego w § 1 lub 2, wyrządza znaczną szkodę majątkową, podlega karze pozbawienia wolności od 3 miesięcy do lat 5.
Art. 268a. § 1. Kto, nie będąc do tego uprawnionym, niszczy, uszkadza, usuwa, zmienia lub utrudnia dostęp do danych informatycznych albo w istotnym stopniu zakłóca lub uniemożliwia automatyczne przetwarzanie, gromadzenie lub przekazywanie takich danych, podlega karze pozbawienia wolności do lat 3.
§ 2. Kto, dopuszczając się czynu określonego w § 1, wyrządza znaczną szkodę majątkową, podlega karze pozbawienia wolności od 3 miesięcy do lat 5.
Art. 269b. § 1. Kto wytwarza, pozyskuje, zbywa lub udostępnia innym osobom urządzenia lub programy komputerowe przystosowane do popełnienia przestępstwa określonego w art. 165 § 1 pkt 4, art. 267 § 3, art. 268a § 1 albo § 2 w związku z § 1, art. 269 § 2 albo art. 269a, a także hasła komputerowe, kody dostępu lub inne dane umożliwiające dostęp do informacji przechowywanych w systemie komputerowym lub sieci teleinformatycznej, podlega karze pozbawienia wolności do lat 3.
§ 2. W razie skazania za przestępstwo określone w § 1, sąd orzeka przepadek określonych w nim przedmiotów, a może orzec ich przepadek, jeżeli nie stanowiły własności sprawcy
class DummyIterator implements Iterator {
private int index = 0;
@Override
public boolean hasNext(){
return false;
}
@Override
public Object next(){
return null;
}
}
javac DummyIterator.java
cat DummyIterator.class
����4
indexI<init>()VCodeLineNumberTablehasNext()Znext()Ljava/lang/Object;
SourceFileDummyIterator.java
DummyIteratorjava/lang/Objectjava/util/Iterator
&
*�*��
�
�
%
javap DummyIterator
Compiled from "DummyIterator.java"
class DummyIterator implements java.util.Iterator {
DummyIterator();
public boolean hasNext();
public java.lang.Object next();
}
import static java.lang.System.out;
out.println(int.class);
out.println(Integer.class);
out.println("Ala ma kota".getClass());
out.println(new String[0].getClass());
out.println(new DummyIterator().getClass());
Object text = "To kot, a to Ala";
if(text.getClass().equals(String.class)){
out.println("Obiekt jest stringiem");
}
Object iterator = new DummyIterator();
if(iterator.getClass().equals(Iterator.class)) {
out.println("Obiekt jest iteratorem");
}
if(iterator instanceof Iterator) {
out.println("Obiekt implementuje interfejs iterator");
}
out.println(new DummyIterator().getClass());
out.println(new DummyIterator().getClass().getClass().getClass().getSuperclass());
class Animal {}
class Mammal extends Animal {}
class Cat extends Mammal {}
class Whale extends Mammal {}
class Reptile extends Animal {}
class Snake extends Reptile {}
List<Class<?>> ancestors(Class<?> klass){
var result = new LinkedList<Class<?>>();
while(klass != Object.class){
result.add(klass);
klass = klass.getSuperclass();
}
result.add(Object.class);
Collections.reverse(result);
return result;
}
ancestors(Snake.class);
Class<?> commonAncestor(Class<?> aClass, Class<?> bClass){
var aAncestors = ancestors(aClass);
var bAncestors = ancestors(bClass);
for(int i = 0; i < aAncestors.size() && i < bAncestors.size(); i++){
if(aAncestors.get(i) != bAncestors.get(i)){
return aAncestors.get(i-1);
}
}
return aAncestors.get(aAncestors.size()-1);
}
out.println(commonAncestor(Cat.class, Snake.class));
out.println(commonAncestor(Cat.class, Whale.class));
interface IVehicle {
void go();
}
class Car implements IVehicle {
public void go(){
out.println("Brum, brum");
}
}
Car.class
class Airplane implements IVehicle {
public void go(){
out.println("Bzzzzzz");
}
}
Airplane.class
class Rocket implements IVehicle {
public void go(){
out.println("BUUUUUUUUUUUM");
}
}
Rocket.class
class VehicleSystem {
public static void main(String[] args){
var vehicles = new LinkedList<IVehicle>();
for(String vehicleName : args){
try {
var klass = (Class<IVehicle>) Class.forName(vehicleName);
vehicles.add(klass.newInstance());
} catch(ClassNotFoundException ex) {
System.out.println("The class " + vehicleName +
" has not been found. ");
return;
} catch(InstantiationException | IllegalAccessException ex) {
System.out.println("The class " + vehicleName +
" cannot be instantiated. ");
return;
}
}
for(IVehicle vehicle : vehicles) {
vehicle.go();
}
}
}
String[] classes = {"REPL.$JShell$55G$Car", "REPL.$JShell$57J$Rocket",
"REPL.$JShell$56J$Airplane", "REPL.$JShell$55G$Car"};
VehicleSystem.main(classes);
void prettyPrint(Object[] elements){
for(Object element : elements)
out.println(element);
}
Class<?> klass = DummyIterator.class;
prettyPrint(klass.getMethods());
prettyPrint(klass.getConstructors());
prettyPrint(klass.getFields());
import java.lang.reflect.*;
Class<?> klass = DummyIterator.class;
Constructor constructor = klass.getConstructor(new Class<?>[0]);
Iterator dummyIterator = (Iterator) constructor.newInstance();
out.println(dummyIterator);
class DummyIterator implements Iterator {
private int index = 0;
public DummyIterator(){
}
public DummyIterator(int index){
this.index = index;
}
@Override
public boolean hasNext(){
return false;
}
@Override
public Object next(){
return null;
}
public String toString(){
return "DummyIterator[" + this.index + "]";
}
}
Class<?> klass = DummyIterator.class;
Constructor constructor = klass.getConstructor(new Class<?>[]{int.class});
Iterator dummyIterator = (Iterator) constructor.newInstance(1);
out.println(dummyIterator);
Method hasNextMethod = klass.getMethod("hasNext", new Class<?>[0]);
out.println(hasNextMethod.getName());
out.println(hasNextMethod.getParameterTypes());
Constructor constructor = klass.getConstructor(new Class<?>[]{int.class});
Iterator dummyIterator = (Iterator) constructor.newInstance(1);
Method hasNextMethod = klass.getMethod("hasNext", new Class<?>[0]);
hasNextMethod.invoke(dummyIterator);
Field indexField = klass.getField("index");
indexField.getName();
indexField.getModifiers();
Field indexField = klass.getDeclaredField("index");
out.println(indexField.getName());
out.println(indexField.getModifiers());
Constructor constructor = klass.getConstructor(new Class<?>[]{int.class});
Iterator dummyIterator = (Iterator) constructor.newInstance(1);
Field indexField = klass.getDeclaredField("index");
indexField.get(dummyIterator);
indexField.setAccessible(true);
out.println(indexField.get(dummyIterator));
indexField.set(dummyIterator,2);
out.println(indexField.get(dummyIterator));
Uwaga: składowe dziedziczone nie są zwracane
import java.lang.reflect.*;
class MethodReplayer implements InvocationHandler {
private List<String> list = new LinkedList<>();
private List<Method> invokedMethods = new LinkedList<>();
private List<Object[]> invokedArguments = new LinkedList<>();
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable{
if(!method.getName().equals("toString")){
invokedMethods.add(method);
invokedArguments.add(args);
}
return method.invoke(list, args);
}
public void replay() throws Throwable {
for(int i = 0; i < invokedMethods.size(); i++){
invokedMethods.get(i).invoke(list, invokedArguments.get(i));
}
}
}
import static java.lang.reflect.Proxy.newProxyInstance;
MethodReplayer replayer = new MethodReplayer();
List<String> list = (List<String>) newProxyInstance(List.class.getClassLoader(),
new Class[] { List.class },
replayer);
list.add("dog");
list.add("cat");
System.out.println(list);
replayer.replay();
System.out.println(list);
[dog, cat] [dog, cat, dog, cat]
Class[]
MethodType
:import java.lang.invoke.*;
import java.lang.invoke.MethodHandles.Lookup;
// np. String toString()
MethodType toStringType = MethodType.methodType(String.class);
// np. Integer parseInt(String str)
MethodType fromStringToInt = MethodType.methodType(Integer.class, String.class);
class CallMeMaybe {
public String toString(){
return "call me maybe";
}
public Lookup getLookup(){
return MethodHandles.lookup();
}
}
CallMeMaybe maybe = new CallMeMaybe();
Lookup maybeLookup = maybe.getLookup();
MethodHandle maybeHandle = maybeLookup.findVirtual(CallMeMaybe.class, "toString", toStringType);
maybeHandle.invoke(maybe);
call me maybe