RecursiveG
本帖最后由 RecursiveG 于 2015-10-25 23:56 编辑

编程开发板块 能力自测

说明

本能力自测题为活跃气氛、增加交流而设计。
欢迎各位触手用力拍砖并提供提供新的题目。
开放答题,欢迎讨论。禁止水回复,否则直接警告+删回复。
回贴按倒序排列

基础篇是任何想要进行Mod/插件开发的人员应知应会的内容
中级篇考察更高级/MC相关的内容
高级篇为专(chù)家(shǒu)准备
部分题目有mod方向和插件方向的区别,可以选择性做题

通常,基础篇接近满分,可以近似无阻碍学习Mod/插件开发。
中级篇接近满分,可以有效完成大部分Mod/插件开发任务。
高级篇……不来写份教程么骚年?

初级篇

1. 连线
项目
分类
JAVA
运行时环境
JVM
编程语言
JRE
开发文档
JDK
运行时虚拟机
JAVAC
开发环境
*.java
目标文件
*.class
Integrated Development Environment
Eclipse
编译器
IDE
IDE
Gradle
源文件
Javadoc
构建工具
2.以下哪些代码能通过编译?假设用到的变量都被正确定义,需要的包也被导入
  1. 1. int i=0;
  2. 2. for(;;);
  3. 3. List<String> myList = null;
  4. 4. Map<Integer, Integer> map = new Map<Integer, Integer>;
  5. 5. Map anotherMap = new Map();
  6. 6. if (currentIndex==index=getIndex()) doSomething();
  7. 7. while(true);
  8. 8. /*/* Important Comment */*/
  9. 9. public static main() {}
  10. 10. private foo(){foo();}
  11. 11. @NotNull MyClass instance = null;
  12. 12. throw RuntimeException();
  13. 13. List<Player> myList = new List<Player>();
复制代码
3. 使用泛型构造一个适合并便于使用的类型用于存储以下JSON
  1. {
  2.   "list1": [
  3.     {
  4.       "subVal1": 11,
  5.       "subVal2": 12
  6.     }, {
  7.       "subVal3": 13,
  8.       "subVal4": 14,
  9.       "subVal5": 15
  10.     }
  11.   ],
  12.   "list2": [
  13.     {
  14.       "subVal6": 16
  15.     }
  16.   ]
  17. }
复制代码
4. 将上一题中的JSON改写为YAML
5. 32位操作系统无法寻址4G以上的内存,请简述原因
6. Java中 foreach 循环的本质是什么?
7. 举出 Java 中的一处语法糖
8. 清楚理解 for, while, do while, for, break/continue 的作用和用法
9. 指出下列哪些函数定义是本质相同的:
  1. void foo(int a, int b);
  2. void foo(int x, int y);
  3. void bar(List<Integer> list);
  4. void bar(List<Double> list);
  5. void foo(Integer a, Integer b);
  6. void foo(List<Integer> list);
  7. void bar(List list);
复制代码
10. 简述 extends 关键字和 implements 关键字的区别
11. 编译以下代码会生成几个.class文件?
  1. public class A {
  2.     public interface IFoo { }
  3.     public static class B implements IFoo { }
  4.     public static void method1(IFoo foo) { }
  5.     public static void method2() {
  6.     method1(new IFoo() { });
  7.     }
  8. }
复制代码
12. 用命令行环境编译并执行以下程序需要执行什么命令?
  1. public class A {
  2.   public static void main() {
  3.     System.out.println("hello, world");
  4.   }
  5. }
复制代码

中级篇

1. 描述以下函数的作用并说明该函数是否高效。若不,试写出一个高效的函数完成同样工作。
  1. int func(int x) {
  2.     if (x == 0 || x == 1) return 1;
  3.     if (x < 0) throw new IllegalArgumentException();
  4.     return func(x - 1) + func(x - 2);
  5. }
复制代码
2. 阅读以下程序段:
  1. public static MyClass {
  2.     public String x;
  3.     public MyClass(String x) {
  4.         this.x = x;
  5.     }
  6. }

  7. public static main(String args[]) {
  8.     String str1 = "String #1";
  9.     List<String> list1 = new ArrayList<String>();
  10.     list1.add(str1);
  11.     str1 = "Not String #1";
  12.     System.out.println(list1.get(0));

  13.     MyClass myClass = new MyClass("String #2");
  14.     List<MyClass> list2 = new ArrayList<String>();
  15.     list2.add(myClass);
  16.     myClass.x = "Not String #2";
  17.     System.out.println(list1.get(0).x);
  18. }
复制代码
程序输出
  1. String #1
  2. Not String #2
复制代码
结合你对`String`类的理解,解释出现以上现象的原因。
3. C++中,使用new构造的对象必须使用delete删除,为什么Java不需要?
4. 结合Java中泛型实现的机制,解释为何 `List<int> a;` 为何无法通过编译
5. 执行下列程序,写出执行结果,并解释原因:
  1. public class A {
  2.   public static class B {
  3.     private int x;
  4.     public B(int x) {
  5.       this.x = x;
  6.     }
  7.   }
  8.   public static void main(String[] args) {
  9.     A a = new A(12);
  10.     try {
  11.       Field f = B.class.getDeclaredField("x");
  12.       System.out.println(f.get(a));
  13.     } catch(Exception ex) {

  14.     }
  15.   }
  16. }
复制代码
6. 有一变量定义 “private static final int NUMBER = 42;” ,欲使用反射修改其值,会有什么问题?
7. 简述MC不能有效利用多核处理器的原因
8. 解释mcp和forge项目之间的关系(MOD方向)
9. 解释forge, cauldron, bukkit之间的关系
10. 编写Mod时,我们会用到Proxy,简述Proxy的作用和使用Proxy的必要性。(mod方向)
11. 解释:什么是NMS类,分析使用NMS类的带来的好处和问题(插件方向)
12. Minecraft是一个商业程式,随意散布会面临法律问题。Forge与Bukkit项目组是如何应对这一问题的?

高级篇

1. 观察<version>.json,纯净的游戏的主类是Minecraft,而安装了Forge的游戏主类是LaunchWrapper。简述LaunchWrapper的作用(mod方向)
2. 解释obfName, srgName, mcpName的区别,并简述mod从编译到运行中经历的两次混淆/反混淆的时机和作用。(mod方向)
3. 简述ASM 和Java Bytecode 的关系。(mod方向)
4. 对比 ASMTransformer 和反射,分析其各自的优势和劣势。(mod方向)

拿 BBCode 排版简直就是灾难 2015-10-23 更新


缇米莉娅
真心跪了,本来还打算业余学学来的......还是做盆友简单些

ufof
初级和中级基本都可以,高级够呛。。看来还需要多学习

风雪大池
我是iOS的。。。有些C语言的东西还是能看懂的。。。

Greensky
本帖最后由 henry5041 于 2015-10-25 12:11 编辑

我泛型和反射没学好,初级和中级也只能勉强通过,果然还要多多学习……

andylizi
本帖最后由 andylizi 于 2015-10-25 12:17 编辑

初级篇
1、连线
Java——编程语言
JVM——运行时虚拟机
JRE——运行时环境
JDK——开发环境
JAVAC——编译器
*.class——目标文件
*.java——源文件
Eclipse——IDE
IDE——Integrated Development Environment
Gradle——构建工具
Javadoc——开发文档
2、能通过编译的代码(你这里怎么有2个5!)
1 2 3 6 10
3、使用泛型构造一个适合并便于使用的类型用于存储以下JSON
  1. List<Map<String,Integer>> list1 = new ArrayList<>();
  2. List<Map<String,Integer>> list2 = new ArrayList<>();
复制代码

4、将上一题中的JSON改写为YAML
  1. ---
  2. list1:
  3. - subVal1: 11
  4.   subVal2: 12
  5. - subVal3: 13
  6.   subVal4: 14
  7.   subVal5: 15
  8. list2:
  9. - subVal6: 16
复制代码

5、喂,我6年级
6、本质当然是for循环这不是废话么
7、泛型
8、它们都是循环语句相关= =具体还需要我一个一个解释?
9、
  1. void foo(int a, int b);
  2. void foo(int x, int y);
  3. void foo(Integer a, Integer b);
复制代码
以及
  1. void bar(List list);
  2. void bar(List<Integer> list);
  3. void bar(List<Double> list);
复制代码

10、extends是继承,继承的可能是一些有方法体的方法,并且也可以选择不重写已经有方法体了的方法,但implements的存在就是让你重写的
11、4个
12、
  1. javac A
  2. java A
复制代码
(我从来都是用IDE编译,打包jar执行,从未。。)

中级篇
有些太复杂懒得写了,我就说一些吧。。
3、这个我不怎么了解,大概是因为Java有自带的垃圾回收机制?还是因为Java没有指针?【扯谈中】
4、简单类型不能作为泛型的参数。原因?它们不算对象
6、不能修改static final,因为它们在java中的定义是,只能被赋值一次,绝对不能在内存中修改的固定值(static和final单独都有此意),但是有一个办法还是可以:
  1. field.setAccessible(true);
  2. Field fieldModifier = field.getClass().getDeclaredField("modifiers");
  3. fieldModifier.setAccessible(true);
  4. fieldModifier.setInt(field, field.getModifiers() & ~Modifier.FINAL);
复制代码
用反射对付反射23333
8、mcp帮你获得Minecraft源码,这样forge就可以使用它们= =【胡扯】
9、bukkit基于官服端,forge基于Minecraft,Cauldron基于forge和bukkit
10、没写过mod
11、NMS是net.minecraft.server包的简称,其优点就是让插件可以做到很多很多神奇的功能(ProtocolLib就是使用了它)缺点就是,因为NMS的包中含有服务器版本号比如v1_7_R1,导致插件只能兼容某某版本
当然这个可以使用多个NMS对应的类,或者反射来解决,不过很麻烦
还有就是Cauldron的NMS是混淆过的,因为它的NMS直接基于官服端
12、6年级路过


高级篇
1、LaunchWrapper会在MC加载之前加载,用途?大概就是将自己的相关程序注(tiao)入(jiao)Minecraft,使其可以做一些超出Minecraft的事
2、obfName就是mod导出完成后,你能在代码里找到的东西,因为你编写mod的时候使用的那些方法名呀之类的,都是进过mcp反混淆的,在使用的时候得混淆回去。srgName?没听说过。mcpName?同样没听说过。简述mod从编译到运行中经历的两次混淆/反混淆的时机和作用?我刚刚在回答obfName的时候已经回答了这个问题了
3、ASM什么鬼?似乎见过的样子(我都说过我没写过mod)
4、同上

RecursiveG
andylizi 发表于 2015-10-25 12:15
初级篇
1、连线
Java——编程语言

哎唷不错。虽然还是有点小瑕疵。两个5那个确实是我的锅。。。
关于反射那题,除了final还有另一个大问题(编译器你别跑这个锅你背上)
另外高级篇的2问题有点大。首先obfName是指a,b,c这种,srgName是method_XXXX_a这种,mcpName才是能望文生义的。编译时的一次混淆你讲了,但其实运行时还有一次反混淆。。。。

andylizi
RecursiveG 发表于 2015-10-26 00:28
哎唷不错。虽然还是有点小瑕疵。两个5那个确实是我的锅。。。
关于反射那题,除了final还有另一个大问题 ...

反射那题有啥问题么。。我测试是可以用的。。
高级篇别怪我,我从未写过mod,只不过是配置完forge环境已经无爱了
话说难道我就错了这么几个?

RecursiveG
andylizi 发表于 2015-10-26 00:30
反射那题有啥问题么。。我测试是可以用的。。
高级篇别怪我,我从未写过mod,只不过是配置完forge环境已 ...

自己实际写代码试试呗
print一下看看到底变不变

有小瑕疵,不过我全指出来就没有讨论的意义了

andylizi
RecursiveG 发表于 2015-10-26 00:34
自己实际写代码试试呗
print一下看看到底变不变

午夜写代码,逗我
然而我在我的ColorMOTD里使用这个方法来注入ProtocolLib的自动更新器使其无法工作,然后ProtocolLib老老实实的提示没有发现更新,只不过那个字段是String[]型。。是因为简单类型还是怎么着。。直接告诉我不行吗,不想开IDE了A.A
想了想90%是因为简单类型,但是具体说不出来

xiweihai
本帖最后由 xiweihai 于 2015-10-26 11:13 编辑

好吧刚刚关完ide看见这个
1.jvm是虚拟机,jre是运行环节,jdk开发环境。javadoc 是api,java编程语言,.java源文件,

eclipse ide, gradle构架工具 .class就是编译好的类
2.第二句就进入死循环的吧,后面都是不可达代。编译不会通过的
3.其实就是一堆集合,jsonarray=arraylist,jsonObject=set
4.对yml使用很少,通常使用自带的gson包用json储存数据
5.2的32次方-1<(4*1024)
6.只知道,遍历数组集合代码更简洁
7.<> : 这样的应该就是语法糖吧
8.for这个不好说多了个定义变量,和执行的环节。while就是为假时跳出。do while 先执行了再判断。

break可以跳出循环或者if这样的语句
9.这个不懂
10 第一个是继承,然后是实现,可以理解为前面做好的,后面的得自己实现
11.两个吧
12.java a
13.int func(int x) {
        int y=0;
        if(x<0){
                throw new IllegalArgumentException();
        }else if(x<2){
                y=1;
        }
        //不然会进入死循环
        int z=x+x-3;
        if(z<0){
                return z;
        }else{
                y=func(z);
        }
        return y;
}
14.因为string是个对象,而list里面储存是以前的对象。直接=""相当于newle另外一个对象,修改应该是str1.replace(str1,"Not String #1")。
15.因为java有内存回收机制,而且java不支持指针
16.int是个基本类型,而集合里面都是是Object,故不行,可使用Integer(编译器会帮你自动转换)
17.12利用java反射读取对象内的变量
18.setAccessible(true);可以暴力获取,至于后果不知道
19.不知道
20.mcp回编译源码,然后forge在此基础上开发api是这样吗
21.不懂
22.也不懂
23.更不懂
24.可以做其他的事情,比如说删除mc的文件,如果mc被打开后文件就被占有了无法删除
25.不懂
26.不懂
27.稍微了解反射,但是前面的没听说过

3TUSK
本帖最后由 u.s.knowledge 于 2015-10-26 04:53 编辑

自学java的路过,看完题目后选择死亡。(基础知识完全不够用系列...)


andylizi
xiweihai 发表于 2015-10-26 01:51
好吧刚刚关完ide看见这个
1.jvm是虚拟机,jre是运行环节,jdk开发环境。javadoc 是api,java编程语言,.jav ...

你对第二题的回答我已经醉了,他的意思是单独把每一句拿出来,没跟你说连起来啊

andylizi
本帖最后由 andylizi 于 2015-10-26 15:51 编辑



果不其然,但是。。。原因在哪里呀原因在哪里
呃,刚刚又试了下,修改数组。。


为什么数组就可以。。

xiweihai
andylizi 发表于 2015-10-26 15:38
你对第二题的回答我已经醉了,他的意思是单独把每一句拿出来,没跟你说连起来啊 ...

随便写写而已,别当真

0x3B800001
本帖最后由 丶皇天 于 2015-10-31 08:58 编辑

话说中级篇的第一题怎么没有人讨论。第一题效率低的原因是用了递归算法吧,作用是求出斐波那契数列第x+1项
  1. int func(int x) {
  2.     if (x == 0 || x == 1) return 1;
  3.     if (x < 0) throw new IllegalArgumentException();
  4.     return func(x - 1) + func(x - 2);
  5. }
复制代码
我的答案是:
int func(int x)
{
    if (x < 0) throw new IllegalArgumentException();
    int i,f1,f2,f3;
    f1=1;
    f2=1;
    for (i=0;i<x;i++)
    {
        f3=f1+f2;
        f1=f2;
        f2=f3;
    }
    return f1;
}








ufof
丶皇天 发表于 2015-10-30 16:53
话说中级篇的第一题怎么没有人讨论。第一题效率低的原因是用了递归算法吧,作用是求出斐波那契数列第x+1项 ...

的确,递归太耗费栈内存。。

0x3B800001
丶皇天 发表于 2015-10-31 08:53
话说中级篇的第一题怎么没有人讨论。第一题效率低的原因是用了递归算法吧,作用是求出斐波那契数列第x+1项 ...

O(log(n))算法?!让我想想

0x3B800001
lz指的是通向公式+快速幂吗?

cqjjjzr
答题卡:
1.
Java语言
JVM虚拟机
JRE环境
JDK开发环境
JAVAC编译器
*.java源文件
*.class目标文件
Eclipse IDE
IDE Integ......
Gradle构建工具
Javadoc开发文档

2.
1,2,3,5,7,10(会出现运行时错误),11,13

3.
List<List> root = new List<>();
List<Map> list1 = new List<>();
Map<String,Integer> sub1to5 = new HashMap<>();
List<Map> list2 = new List<>();
Map<String,Integer> sub6 = new HashMap<>();
root.add(list1);
root.add(list2);
list1.add(sub1to5);
list2.add(sub6);

4.不会

5.32位寻址系统的长度不足以存放4G以上内存的内存地址

6.for

7.泛型

8.for:加强的while while:条件循环 dowhile:执行一次之后条件循环 breakcontinue:跳出循环和开始下一次循环

9.1,2
3.7 4,7

10.extends继承类,implements实现接口

11.4

12.javac A.java
java A

中级
1.不。
int func(int x) {
    if (!(x > 1)) return 1;
    if (x < 0) throw new IllegalArgumentException();
    return func(x - 1) + func(x - 2);
}
接下来的后面填坑

ufof
本帖最后由 ufof 于 2015-11-30 05:10 编辑

好吧,看到那么多人参与。我也小试身手一下。

初级篇

1.

Java ---- 编程语言
JVM ----  运行时虚拟机
JRE ---- 运行时环境
JDK ---- 开发环境
javac ---- 编译器
*.java ---- 源文件
*.class ---- 目标文件(字节码文件更好?)
Eclipse ---- IDE
IDE ---- Integrated Development Environment
Gradle ---- 构建工具
Javadoc ----  开发文档

2.

  1. 1. int i=0;
  2. 2. for(;;);
  3. 3. List<String> myList = null;
  4. 4. Map<Integer, Integer> map = new Map<Integer, Integer>;
  5. 5. Map anotherMap = new Map();
  6. 6. if (currentIndex==index=getIndex()) doSomething();
  7. 7. while(true);
  8. 8. /*/* Important Comment */*/
  9. 9. public static main() {}
  10. 10. private foo(){foo();}
  11. 11. @NotNull MyClass instance = null;
  12. 12. throw RuntimeException();
  13. 13. List<Player> myList = new List<Player>();
复制代码
1. 可以
2. 可以通过编译(如果后面没有其他语句),但是会陷入无限循环。如果后面有语句,会是unreachable的,那就会报错
3.
可以
4. 语法问题,写构造方法的参数的括号忘了
5. 可以
6. 不可以,赋值运算符优先级是最低的,然而if中的括号必须是布尔
7. 同②
8. 不可以,多行注释不可以嵌套。最后一个关闭标记没有找到与之对应的开始标记
9. 不可以。主方法也是方法,返回值类型必须声明
10. 如果foo是构造方法,可以通过。如果不是,不可以。另外,这是无限制的递归,会陷入死循环
11. 取决于@NotNull这个Annotation(Java有提供这个Annotation吗?)
12. 不可以。throw抛出的是一个异常的对象。可以使用匿名对象“throw new RuntimeException()”
13. 可以。然而,Java 7之后“new List<Player>()”可以被简化为“new List<>()”,也就是菱形语法

3,4跳过(不了解JSON,惭愧)

5.
因为32位系统位数不够,2^31-1不足以寻址4G内存

6. foreach的本质当然是for

7.
Lambda表达式是一个语法糖,用于简化匿名内部类。还有一个前提,就是匿名内部类必须是函数式接口的实现类。例如这段程序:

  1. new Thread(new Runnable(){
  2.     @Override
  3.     public void run(){
  4.          System.out.println("run");
  5.     }
  6. });
复制代码

在这个程序中,需要使用匿名内部类的方式实现Runnable并传入Thread类的构造方法。但是Lambda表达式可以把这个化简成:

  1. new Thread(() -> System.out.println("runs"));
复制代码

8.


LZ貌似写了两个for。。

9.

  1. void foo(int a, int b);
  2. void foo(int x, int y);
  3. void bar(List<Integer> list);
  4. void bar(List<Double> list);
  5. void foo(Integer a, Integer b);
  6. void foo(List<Integer> list);
  7. void bar(List list);
复制代码

foo(int a, int b)和foo(int x, int y)两个方法本质相同。很容易理解,因为两个方法的形参列表是相同的(int, int),只是形参名不一样。

然而对于foo(Integer a, Integer b),虽说Integer是int的包装类,但是形参列表是不同的,所以说和前两个本质有区别。

“void bar(List<Integer> list)”和“void foo(List<Integer> list)”两个方法本质一样。只是方法名不一样罢了。

关于三个bar(),虽说形参中的List有着不同的泛型,方法本质依旧一样。因为无论是List<Integer>、List<Double>等,都是instanceof List。只是传入实参时应当注意一下就行了。

10.

extends是指类继承另外一个类;implements是类实现一个接口。

如果A类继承B类,那么A类获得B类中的所有类成员;如果A类实现B接口,那么A类就必须遵守B接口的“规范”,也就是要复写B接口的所有方法。

11. 应该4个

12.

首先使用javac命令对这个源代码文件进行编译,会生成一个.class文件,也就是字节码文件。

然后使用java运行这个字节码文件。

中级篇

1.

这个方法不算是很高效。这是因为在方法中使用递归的算法运算斐波那契数。然而,递归算法每递归一次就会在栈内存给方法分配一个栈区。递归多了又出现栈内存溢出的风险。

应当使用循环来解决这个问题:

  1. static int func(int x) {

  2.         if (x < 0)
  3.                 throw new IllegalArgumentException("only positive integers please");

  4.         int num1 = 1;
  5.         int num2 = 1;
  6.         int result = 0;

  7.         for (int count = 0; count < x; count++) {
  8.                 result = num1 + num2;
  9.                 num1 = num2;
  10.                 num2 = result;
  11.         }

  12.         return result;
  13. }
复制代码

2.  选择死亡

3.

本人对C++不太了解。但是感觉是因为指针的关系,为了释放资源必须删除。或者因为Java有自动的垃圾回收机制,C++没有。

4. 这是因为指定泛型的类型时必须是引用数据类型。int是基本数据类型。可以改成int的包装类Integer。

5.  选择死亡

6.  
不可以。static final的字段十分特殊:首先在内存共享区中只有一个这样的字段,因为属于类而不是实例;还是最终的。所以说这个值永永远远就是刚开始给其赋的值。即使使用反射应该也会报错。

剩下的我全部选择死亡.. 我对插件以及mod还不是太了解,只会Java这个编程语言。请过目@RecursiveG





ufof
ufof 发表于 2015-11-30 04:53
好吧,看到那么多人参与。我也小试身手一下。

初级篇

@RecursiveG

andylizi
ufof 发表于 2015-11-30 20:53
好吧,看到那么多人参与。我也小试身手一下。

初级篇

恭喜你跟我一样上当了……foreach的本质是迭代器……我后来才想起来……

Faints_小梦
完全看不懂,比较初二党!

土球球
本帖最后由 ustc_zzzz 于 2015-12-31 15:27 编辑

直接从中级开始吧= =初级的懒得答了= =

(随便答答不要较真)

中级篇:


高级篇:


@RecursiveG

TPAMCMOD
头脑已经烧了......{:10_519:}

DarcJC
本帖最后由 z25096708 于 2016-3-4 20:42 编辑
andylizi 发表于 2015-12-8 21:06
恭喜你跟我一样上当了……foreach的本质是迭代器……我后来才想起来……

看到一大堆代码还没注释我脑子就炸了












梨子= =你拿到TDIANT送的梨子没= =
=======================================================
@andylizi 梨子= =上次StupidTdiant还给你在淘宝选购梨子。。。。。。。。







mingl0280
don't have a Chinese input method.
Start with medium level:
1. Do not use recursive. Recursive will break the stack.
  1. int Feb(int operation_time)
  2. {
  3.     if (x < 0) throw new IllegalArgumentException();
  4.     if (x+1<=2) return 1;
  5.     return (1/Math.sqrt(5)*(Math.pow((1+Math.sqrt(5))/2,operation_time+2))-(Math.pow((1-Math.sqrt(5))/2,operation_time+2)))-1;
  6. }
复制代码
---Pure math...2. Part 1:
Reference to origin string is replaced to the new string while the List is not replaced.
Part2:
Static means same memory location, which means only one MyClass will be referenced.
3.C++ doesn't have automatic GC (But you can write a pure virtual destroyer with delete operation in base class so the compiler will automatically destroy them. Not effective on isolated references)
4. Java: int is not an object.
5. Not even able to compile... (Constructor is not defined)
6. private static final? I'm not sure if this allows reflection to change its value.
7. Not only Minecraft but almost all the games required Drawningto screen. Drawning a frame costs a lot of time and you can only display one frame at a time so (almost) no one will care about multi-threading in a game.
8. MCP=anti-obf tool for MC, NO MCP NO Forge.
9. Forge / Bukkit: API, Bukkit supports for server plugins mostly and Forge supports both. Cauldron is a server-based mixture of Forge and Bukkit (allows Forge/modloader mods and bukkit plugins at the same time)
10. Allows single-file supports both server and client.
11. NMS=net.minecraft.server, for advanced abilities. However, a version number is included.
12. Not allowed to "spread" any Minecraft original file, only modifying is allowed.

Advanced section
1.LaunchWrapper is used to do some stuff before MC really starts, like mod sorting, scanning, class patching...
2.obfName = names like "a","bcd"...
srgname = "func_12345_a"
mcpName = "net/minecraft/itemStack/Itemstack"
modding: obfName, srgname -> mcpName
compiling: mcpName -> srgname, obfName
Running: (Forge) obfName -> srgName
3. ASM is a bytecode manipulation and analysis framework for modifying existing classes or dynamically generate classes directly into bytecode.
4. ASMTransformer is UNSAFE. Reflection is LIMITED.




liuadcheng
  1. int func(int x) {
  2.     if (x == 0 || x == 1) return 1;
  3.     if (x < 0) throw new IllegalArgumentException();
  4.     return func(x - 1) + func(x - 2);
  5. }
复制代码
  1.         int func(int x)
  2.         {
  3.             if ((x & 0x80000000) > 0)
  4.             {
  5.                 return -1;
  6.             }
  7.             if ((x & 0x7ffffffe) > 0)
  8.             {
  9.                 return func(x - 1) + func(x - 2);
  10.             }
  11.             return 1;
  12.         }
复制代码

3401286177
太有用了qwq

1346322928
表示不会编辑

LB丶Ming
看不懂
膜拜大神

34ft

还好我有会c语言

Yaossg
andylizi 发表于 2015-10-26 15:46
果不其然,但是。。。原因在哪里呀原因在哪里
呃,刚刚又试了下,修改数组。。

如果没猜错,在编译的时候编译器就把所有常量的值覆盖到他们对应的位置了,也就是说其实你在编译好的东西里已经看不见NUMBER了
(和c++的const有异曲同工之妙)

Zheng_fourth
最后5个不懂

HMTD
c#表示异曲同工,不过,还是不会Java,弱弱问一句,c#能不能编插件?

HMTD
34ft 发表于 2016-11-15 17:04
还好我有会c语言

c语言是非托管代码,和Java/c#差远了,我学C#的都觉得累

coves
本帖最后由 coves 于 2017-2-17 23:11 编辑

int func(int x) {
            if (x < 0) throw new IllegalArgumentException();
            return (x-1)<1?1:func(x - 1) + func(x - 2);
        }

luojiarui
HMTD 发表于 2017-2-8 02:24
c#表示异曲同工,不过,还是不会Java,弱弱问一句,c#能不能编插件?

C#是微软.net框架的编程语言。。


HMTD
luojiarui 发表于 2017-3-1 15:09
C#是微软.net框架的编程语言。。

和java长得差不多

luojiarui
HMTD 发表于 2017-3-4 10:24
和java长得差不多

两者不是同一个东西。。。

java程序运行于JVM之上,C#程序运行于.net框架之上

qirou
密密麻麻头皮发麻

Limbol_Rain
本以为可以通过测试
结果是我没带脑子。。。

johnlj77
没有答案吗。。。。想找对比啊。。

DefineEvil
andylizi 发表于 2015-10-26 15:46
果不其然,但是。。。原因在哪里呀原因在哪里
呃,刚刚又试了下,修改数组。。

数组为引用类型

andylizi

唔这个问题是我很久以前回答的,现在已经弄明白了,谢谢

1392684709
第一题为什么两个IDE

山雀雀
看半天“这和我学的C++不一样啊但是好像又一样”
然后“哦原来这是java”

1146537933
这些都是个啥子哟╮(╯_╰)╭

lq2007
所有mod方向的都不会,剩余的还能答上来(毕竟学过Java),问我需要多长时间学会mod o(?^`)o

第一页 上一页 下一页 最后一页